2010-11-18 5 views
3

.Net에서 지시선을 그리는 방법에 대한 제안 사항이 있으십니까? 나는 현재 Graphics.DrawLine을 대시가있는 펜과 함께 사용하고 있습니다. 그러나 대시는 양방향을 가리 킵니다. 나는 그들에게 한 방향으로 모든 것을 가르쳐주고 싶다..Net에서 어떻게 지시선을 그립니까?

using (var p = new Pen(Color.FromArgb(190, Color.Green), 5)) 
{ 
    p.StartCap = LineCap.Round; 
    p.EndCap = LineCap.ArrowAnchor; 
    p.CustomEndCap = new AdjustableArrowCap(3, 3); 
    p.DashStyle = DashStyle.Dash; 
    p.DashCap = DashCap.Triangle; 
    e.Graphics.DrawLine(p, startPt, pt); 
} 
+2

당신이 갖고있는 것의 스크린 캡과 당신이 원하는 것의 모형은 매우 도움이 될 것입니다. –

+0

그가 원하는 것은 마치 대시가 선이가는 방향 (즉, EndCap의 화살표와 같은 방향)을 나타내는 화살표를 갖는 것입니다. 또는 화살표가 아니라면 대시를 그 끝에 붙이고 다른 끝을 평평하게 또는 둥글게하십시오. – wageoghe

+1

할 수 없습니다. DashCap은 대시의 양쪽 끝에 적용됩니다. –

답변

2

이것은 매우 도움이 될 수 있지만하지 않을 수 있습니다 우리가 내가 있었다 다른 프로젝트에 일의이 유형을 달성하는 방법 실제 회선을 계산 한 다음 "실제"펜을 사용하여 각 회선을 개별 회선으로 그려주는 사용자 지정 "펜"을 구현하는 것입니다. 이런 식으로해야한다면 실제로 "펜"레벨의 StartCap 및/또는 EndCap을 각 대시에 적용 할 수 있습니다.

사용자 정의 "펜"은 대시/갭 길이의 배열 또는 시퀀스 (또는 내부적으로 특정 대시/갭 길이로 해석되는 표준 펜 스타일의 열거 형)를 받아 들여야합니다.

우리는 GDI 기반의 드로잉 시스템을 사용하여 이것을 오래 전에했는데, GDI를 지원하는 선 스타일보다 더 많은 선 스타일을 지원해야했습니다.

재미있는 연습이지만 설명하는대로 대시를 반드시 써야하는 경우가 아니라면 더 많은 문제가 발생할 수 있습니다. 여기

[편집]

은 당신이 그렇게 경사하는 경우는,이 ​​작업을 수행하는 방법에 대한 몇 가지 예제 코드입니다.

첫 번째는 Graphics 개체의 확장 메서드입니다. 펜, 대시 길이, 간격 길이, 시작점 및 끝점이 필요합니다. 그것은 p1-> p2 라인을 따라 보간하고 "dash"길이 세그먼트를 그리고 "gap"길이 세그먼트를 건너 뜁니다. 전달 된 펜은 화살표 엔드 캡이있는 견고한 모양이어야합니다 (원하는 효과를 얻기 위해).

코드는 꽤 거칠지 만 동작은 다음과 같습니다. 입력 줄이 전체 대시 + 갭 길이보다 짧으면 입력 된 펜을 사용하여 선이 그대로 그려집니다. 입력 라인이 전체 대시 + 갭 길이보다 길면 라인의 "나머지"가 대시 + 갭 길이보다 작을 때까지 "대시"길이 라인이 그려지며, 나머지는 그대로 그려집니다 입력 펜으로

경로 드로잉을 구현하려는 경우 중간 값 정점 주변을 보간해야합니다 (단, 저렴한 가격으로 각 세그먼트의 대시를 별도로 계산하지 않는 한). 나는 코드가 큰 (또는 ;-)도 반드시 좋은 것을 주장하지 않습니다

private void button1_Click(object sender, EventArgs e) 
{ 
    using (var p = new Pen(Color.FromArgb(190, Color.Green), 5)) 
    { 
    p.StartCap = LineCap.Round; 
    p.EndCap = LineCap.ArrowAnchor; 
    p.CustomEndCap = new AdjustableArrowCap(3, 3); 
    p.DashStyle = DashStyle.Solid; 
    var graph = this.CreateGraphics(); 
    graph.DrawDashedLine(p, 20, 10, new PointF(20, 20), new PointF(500, 500)); 
    } 
} 

을하지만, 그것은 당신에게 좋은 출발점을 제공한다 : 여기

public static void DrawDashedLine(this Graphics g, Pen p, float dash, float gap, PointF s, PointF e) 
    { 
     float dx = e.X - s.X; 
     float dy = e.Y - s.Y; 

     float len = (float)Math.Sqrt(dx * dx + dy * dy); 
     float remainder = len; 

     float vx = dx/len; 
     float vy = dy/len; 

     if (len <= dash + gap) 
     { 
     g.DrawLine(p, s, e); 
     return; 
     } 

     PointF last = s; 

     while (remainder > dash + gap) 
     { 
     PointF p1 = new PointF(last.X, last.Y); 
     PointF p2 = new PointF(p1.X + vx*dash, p1.Y + vy*dash); 

     g.DrawLine(p, p1, p2); 

     last = new PointF(p2.X + vx*gap, p2.X + vy*gap); 

     remainder = remainder - dash - gap; 
     } 

     if (remainder > 0) 
     { 
     g.DrawLine(p, last, e); 
     } 
    } 
    } 

당신이 그것을 부를 것이다 어떻게 당신이 진짜로 당신의 지시 한 선을 당기기에 흥미있는 경우에.

행운을 빈다.

+0

감사합니다. 나는 아마 그것을 사용하지 않을 것이다 (나는 무딘 대시와 함께 살 것이다). 그러나 이것이 내가 찾고 있었던 것 같다. – Brian

2

흠 ... 어쩌면 내가 모르는 뭔가가 있어요,하지만 난이 (거의) 동일한 코드를 사용할 때, 나는 단지 한 지점과 방향 화살표를 얻을.

private void button2_Click(object sender, EventArgs e) 
{ 
    using (var p = new Pen(Color.FromArgb(190, Color.Green), 5)) 
    { 
     p.StartCap = LineCap.Round; 
     p.EndCap = LineCap.ArrowAnchor; 
     p.CustomEndCap = new AdjustableArrowCap(3, 3); 
     p.DashStyle = DashStyle.Dash; 
     p.DashCap = DashCap.Triangle; 
     var graph = this.CreateGraphics(); 
     graph.DrawLine(p, new Point(20, 20), new Point(150, 150)); 
    } 
} 

그리고 출력 : 여기에

내 코드입니다 alt text

+0

대시가 올바른 방향을 향하게하고 싶습니다. – Brian

관련 문제