2010-07-26 33 views
5

Tôi đã tạo ra một hình dạng tùy chỉnh, về cơ bản nó là một bộ sưu tập của bốn đối tượng Arc2D.Java - Điền vào một hình dạng tùy chỉnh

Khi các vòng cung này được vẽ, chúng tạo thành những gì có thể được coi là hình dạng ngôi sao tròn bốn điểm, giống như một cây cỏ ba lá. Khi một vòng cung kết thúc, cái kia bắt đầu. Chúng tạo thành một hình vuông ở trung tâm. Vì vậy, hãy tưởng tượng, lấy một hình vuông và vẽ nửa vòng tròn ở mỗi bên.

Tôi có thể vẽ hình này thành đối tượng Graphics2D, nhưng khi tôi tô nó, nó sẽ chỉ lấp đầy vòng cung chứ không phải hình vuông trung tâm. Điền vào ô vuông bên trong này là vấn đề của tôi.

Tôi đã triển khai phương thức getPathIterator(), bên dưới. Tôi cũng đã triển khai phương thức . Nhưng nó vẫn sẽ chỉ lấp đầy vòng cung.

Tôi đã cố thêm Rectangle. Khi điền vào hình dạng, hình chữ nhật/hình vuông sẽ được lấp đầy đúng cách, tuy nhiên nó cũng vẽ hình chữ nhật, mà rõ ràng nên được mong đợi, nhưng chắc chắn không phải là kết quả mong muốn.

Vì vậy, có ai có bất kỳ ý tưởng nào về cách "lấp đầy" hình dạng như vậy không?

public PathIterator getPathIterator(AffineTransform at) { 
    GeneralPath gp = new GeneralPath 

    for (Arc2D arcs : this.arcs) { 
     gp.append(arc, false); 
    } 

    return gp.getPathIterator(at); 
} 
+0

kiểu đóng cửa của 'trường Arc2D' của bạn là gì? – trashgod

Trả lời

4

Bất cứ khi nào tôi tạo hình dạng, tôi luôn tạo đối tượng Path2D.Double. Sau đó, tôi sử dụng moveTo để đến vị trí bắt đầu, và một sự kết hợp của lineTo() và curveTo() để di chuyển xung quanh đường dẫn. Sau đó, khi tôi hoàn thành, tôi gọi hàm closePath(). Nó luôn được điền chính xác.

Tôi không có bất kỳ kinh nghiệm nào khi triển khai getPathIterator, nhưng tôi lưu ý rằng bạn không thực hiện lệnh closePath(). Tôi không biết nếu đó là cần thiết hay không, nhưng tôi cảm thấy như dùng cách tiếp cận của tôi sẽ làm việc.

Dưới đây là một ví dụ mà điền vào một hình chữ nhật tròn:

 
double width = 300; 
double height = 400; 
Path2D.Double path = new Path2D.Double(); 
path.moveTo(0.0, 8.0); 
path.curveTo(0.0, 0.0, 8.0, 0.0, 8.0, 0.0); 
path.lineTo(width - 8.0, 0.0); 
path.curveTo(width, 0.0, width, 8.0, width, 8.0); 
path.lineTo(width, height - 8.0); 
path.curveTo(width, height, width - 8.0, height, width - 8.0, height); 
path.lineTo(8.0, height); 
path.curveTo(0.0, .height, 0.0, height - 8.0, 0, height - 8.0); 
path.closePath(); 
g2.fill(path); 
+0

Tôi sẽ cho nó một shot. Tôi đã gọi closePath() nhưng thấy rằng nó chỉ đóng vòng cung cuối cùng. – abrightwell

+0

Điều này chắc chắn giải quyết vấn đề điền. Nó được chứng minh là một chút khó khăn để có được chính xác hình dạng mà tôi muốn, nhưng đó là tính toán của vấn đề đường cong. – abrightwell

+0

Yêu cầu nhiều công việc, nhưng cung cấp cho bạn chính xác những gì bạn muốn. Cảm ơn! –

0

Thay đổi quy tắc quanh co cho GeneralPath

gp.setWindingRule(GeneralPath.WIND_NON_ZERO); 
Các vấn đề liên quan