2011-04-08 6 views
4

일부 핵심 그래픽을 처리하고 있는데 선이 화면에 표시 될 부분이 있는지 여부를 알 수 있을지 궁금합니다.그래픽 - 화면의 너비를 고려하여 화면에 선이 보이는지 알 수 있습니까?

x-5, y3에서 x2, y-7로 이동해 봅시다. 너비가 1 픽셀이면 아무 것도 화면에 표시되지 않습니다. 너비가 15 픽셀 인 경우 그 일부가 표시됩니다.

어떻게 확인할 수 있습니까?

+0

재미있는 question.May 물어? 공연? –

+0

@Nick Weaver : 당분간은 성능 향상을 위해 사용되지만, 뷰를 자르고있는 선 부분에 따라 그래픽 효과를 내기도합니다. 그러나 대답은 두 문제 모두 다를 수 있습니다. – Oliver

+0

내가 틀렸다면 정정 해주세요. 두 경우 모두 라인이 표시 될 것이라고 생각하지만 실제로는 맨눈으로 볼 때 육안으로보기에는 너무 작습니다. – visakh7

답변

4

줄이있는 경우 아래 기능으로 작업 할 수 있습니다. 그렇지 않으면 선의 전체 길이를 살펴보고 특정 거리에 선 너비 크기의 사각형을 만들고보기 안에 있는지 확인하는 것이 좋습니다. 예 : x0y0에서 x7y0까지의 행이있는 경우. 당신은 x1y0으로 가서 당신의 그림 선의 크기의 사각형을 만들고 (이 예제에서는 15) 이것을 화면과 겹치게 볼 수 있습니다. 다음 x2y0 등으로 이동하십시오. 장점은 베 지어 곡선 (베 지어 작업으로 어떻게 충분할지 약간의 위키 정보)에서도 작동합니다.

// 편집 : (만든 작은 베 지어 체크 기능, 작동해야하지만 테스트를하지 않은 경우) 그리고 그리기 전에 각 라인을 확인하기 위해 더 성능이 효율적으로 생각하지 않는다 :

- (void)bezierWithStart:(CGPoint)start cp1:(CGPoint)cp1 cp2:(CGPoint)cp2 end:(CGPoint)end withWidth:(float)wid { 
    for (float i = 0.0; i<=1.0; i+=0.05) { // how many steps 
     CGPoint chk1 = CGPointMake(start.x+((cp1.x-start.x)*i), start.y+((cp1.y-start.y)*i)); 
     CGPoint chk2 = CGPointMake(cp1.x+((cp2.x-cp1.x)*i), cp1.y+((cp2.y-cp1.y)*i)); 
     CGPoint chk3 = CGPointMake(cp2.x+((end.x-cp2.x)*i), cp2.y+((end.y-cp2.y)*i)); 

     CGPoint chk4 = CGPointMake(chk1.x+((chk2.x-chk1.x)*i), chk1.y+((chk2.y-chk1.y)*i)); 
     CGPoint chk5 = CGPointMake(chk2.x+((chk3.x-chk2.x)*i), chk2.y+((chk3.y-chk2.y)*i)); 

     CGPoint cPoint = CGPointMake(chk4.x+((chk5.x-chk4.x)*i), chk4.y+((chk5.y-chk4.y)*i)); 

     CGRect drawLine = CGRectMake(cPoint.x-(wid/2), cPoint.y-(wid/2), wid, wid); 

     // check if rect is in view 
    } 
} 

// EDIT 끝

하지만 지금은 단순한 라인 기능으로 이동 할 수 있습니다 :

- (void)testLine:(CGPoint)fp toSecond:(CGPoint)sp withWidth:(float)wid { 
    float xratio = sp.x - fp.x; 
    float yratio = sp.y - fp.y; 
    double a = sqrt(((wid*wid)*(xratio*xratio))/((yratio*yratio)+(xratio*xratio))); 
    a/=2; // because line width goes in both direction 
    double b = (yratio/xratio)*a; 
    if ((xratio<0.0 && yratio<0.0) || (xratio>0.0 && yratio>0.0))b*=-1; 
    CGPoint diffFrom1 = CGPointMake(fp.x+a, fp.y+b); 
    CGPoint diffTo1 = CGPointMake(sp.x+a, sp.y+b); 
    a*=-1; 
    b*=-1; 
    CGPoint diffFrom2 = CGPointMake(fp.x+a, fp.y+b); 
    CGPoint diffTo2 = CGPointMake(sp.x+a, sp.y+b); 
} 

당신이 4 점을 얻을 것이다. 2 줄, 원본 줄의 위와 아래 하나, 그리기 너비의 절반 크기. 뒤에있는 계산은 그리기 방향과 원래의 선과의 차이를 가져 오는 것입니다. 그러나 그것으로 얻고 싶은 사람들을 heres 내 사전에 계산 : 당신이 알아야 할 이유

enter image description here

+0

하나의 체크 포인트가있는 베 지어의 경우 chk1-3을 제거하고 줄만있는 경우 chk4도 제거합니다 및 chk5 (및 매개 변수를 조정) –

+0

+50, 좋은 답변을 주셔서 감사합니다, 아주 좋아 보인다. –

관련 문제