2014-06-24 36 views
2

我想在二維空間中繪製兩個一般的三角形,使它們共享一個邊,使用Quartz2D。我使用此代碼爲繪圖:三角形與Quartz2D繪圖的完美對齊

- (void)drawRect:(CGRect)rect 
{ 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    Triangle *t1 = [triangles objectAtIndex:0]; 
    Triangle *t2 = [triangles objectAtIndex:1]; 

    [self fillTriangle:t1 inContext:context]; 
    [self fillTriangle:t2 inContext:context]; 
} 

- (void) fillTriangle:(Triangle *)t inContext:(CGContextRef)ctx 
{ 
    CGContextMoveToPoint(ctx, t.p1.p.x, t.p1.p.y); 
    CGContextAddLineToPoint(ctx, t.p2.p.x, t.p2.p.y); 
    CGContextAddLineToPoint(ctx, t.p3.p.x, t.p3.p.y); 
    CGContextAddLineToPoint(ctx, t.p1.p.x, t.p1.p.y); 

    CGContextSetFillColorWithColor(ctx, t.color.CGColor); 
    CGContextFillPath(ctx); 
} 

其中TriangleNSObject子拿着三個點和顏色。

的問題是,即使他們分享兩點,有一個「空間」他們之間,當我用這個代碼填充它們,如顯示的圖像:

Two triangles sharing one edge

問題:任何人知道如何擺脫空間,以便從一個三角形到另一個三角形無縫過渡,沒有線條或其間的任何東西?我想繼續使用Quartz2D,但我很樂意提供任何幫助。謝謝!

編輯:有答案顯示該問題是由子像素抗鋸齒引起的,以及將所述線路

CGContextSetAllowsAntialiasing(ctx, NO); 

fillTriangle方法解決了。但這不是我想看到的結果 - 我不喜歡它被混淆,如第二張圖片所示。

Two triangles aliased

問題更新:你知道,如何解決這兩個問題,那就是,保持圖像乾淨,沒有醜陋的鋸齒,但是三角形之間沒有空間?

EDIT2:因此,正如答案中指出的那樣,我可以添加行筆劃代碼,刪除抗鋸齒標記,筆畫將填充空間。這裏是最後的形象示發生了什麼:

enter image description here

通知重疊框外的線條。我想知道原因可能是什麼,當我將的寬度設置爲0.5f(因爲視網膜,這意味着1px,這可能是響應者的想法),並且這真的解決了整個問題。感謝所有幫助!

回答

1

問題是您正在使用抗鋸齒繪製。禁用它爲您的上下文通過

CGContextSetShouldAntialias(context, NO); 

和一切都應該罰款。

編輯: 在需要抗鋸齒的情況下(更新後的多色的例子),你可以嘗試不僅填補了三角形,而且行程它們在同色系的1px的線寬邊界:

CGContextSetLineWidth(ctx, 0.5f); 
    CGContextDrawPath(ctx, kCGPathFillStroke); 

當然你應該在這種情況下刪除CGContextSetShouldAntialias行。這是一個簡單的解決方案,但可能不是最好的性能明智的,因爲路徑必須被撫摸和填充。

+0

與其他答案相同的信息,但你發佈了一個解決它的代碼!謝謝:)編輯:實際上,它解決了三角形之間的透明線的問題,但現在它看起來不好用不同的顏色。我會更新這個問題。 – Gyfis

+0

用已編輯問題的可能解決方案更新了答案。 – robert

+0

非常感謝您的更新答案!我也更新了這個問題 - 這在某種程度上有所幫助,但並不完美,不幸的是 – Gyfis

1

您可能會獲得亞像素渲染的抗鋸齒效果。當事情不是整體時,會發生這種情況。

但更重要的是,如果這些需要共享邊緣並且顏色相同,則只需繪製一個四邊形。

+0

雖然我沒有提及(對那個抱歉),但顏色不一定是相同的,所以繪製四邊形不會解決問題,但你是對的,雖然我得到了亞像素渲染的抗鋸齒效果!指出:)謝謝你的答案! – Gyfis

+0

這樣想。請記住,Quartz基本上是一個PDF繪圖模型。這意味着它從前到後逐層繪製(以及程序)。這就像打印。 (再次PDF) – uchuugaka

+0

這意味着你可以分層的東西。在四邊形上畫一個三角形可能會很方便。這樣就可以控制有角度邊緣的亞像素渲染。你知道什麼顏色是什麼顏色的別名。 – uchuugaka