문제

주어진 배열의 포인트,그것은 쉬운 라인을 그리는 이를 기반으로,예를 들어,를 사용하 GraphicsPath 클래스입니다.

예를 들어,다음과 같은 편의 포인트를...

[0]: (0,0)
[1]: (100,0)
[2]: (0,100)
[3]: (100,100)

...설명합니다 라인을 닮 Z.

하지만 여기에 도전;필요해요 그리는 둥근 모서리의 반경어10 픽셀이 있습니다.에 의해 모서리를 내 말은 지점에는 선지 않을 시작 또는 끝 지점.이 경우에 있는 두 개의 모서리 (0,100)(100,0).

사진 베지 곡선과 호,일부 의 수있는 보유 솔루션-I 수 없었던 그것을 찾기 위해 자신을 아직,이후를 처리할 수 있 라인을 그려진 모든 각도에서,단지 수평 또는 수직 라인입니다.

설정 LineJoinPenRound 지 않는 충분한 이후,이것을 보여줍와 더 넓은 펜입니다.


편집: 을 명확히,나는 잘 알고 있의 베지,곡선과 호의 기능을 GraphicsPath 클래스입니다.내가 찾는 일부에 대한 더 구체적 조언에 관련하여 구축하는 알고리즘을 수 있는 점,그리고 그들을 함께 문자열 둥근 모서리와 함께.


솔루션

나는 다음과 같은 기능을 반환하는 경로를 나타내는 라인으로 둥근 모서리입니다.이 기능을 사용 LengthenLine 기능을 찾을 수 있습니다 .

protected GraphicsPath GetRoundedLine(PointF[] points, float cornerRadius)
{
  GraphicsPath path = new GraphicsPath();
  PointF previousEndPoint = PointF.Empty;
  for (int i = 1; i < points.Length; i++)
  {
    PointF startPoint = points[i - 1];
    PointF endPoint = points[i];

    if (i > 1)
    {
      // shorten start point and add bezier curve for all but the first line segment:
      PointF cornerPoint = startPoint;
      LengthenLine(endPoint, ref startPoint, -cornerRadius);
      PointF controlPoint1 = cornerPoint;
      PointF controlPoint2 = cornerPoint;
      LengthenLine(previousEndPoint, ref controlPoint1, -cornerRadius / 2);
      LengthenLine(startPoint, ref controlPoint2, -cornerRadius / 2);
      path.AddBezier(previousEndPoint, controlPoint1, controlPoint2, startPoint);
    }
    if (i + 1 < points.Length) // shorten end point of all but the last line segment.
      LengthenLine(startPoint, ref endPoint, -cornerRadius);

    path.AddLine(startPoint, endPoint);
    previousEndPoint = endPoint;
  }
  return path;
}
도움이 되었습니까?

해결책

베지 곡선은 매우 간단하게 구현하기:

http://www.codeproject.com/KB/recipes/BezirCurves.aspx

다행히 당신은 또한 당신이 그들의 일환으로 GraphicsPath 등을 하는 경우 생략의 처참한 상세정보:

http://msdn.microsoft.com/en-us/library/system.drawing.drawing2d.graphicspath.addbezier.aspx

고 또한 찾을 수 있습으로 스플라인:

http://msdn.microsoft.com/en-us/library/system.drawing.drawing2d.graphicspath.addcurve.aspx

다른 팁

이 기능을 사용하여 사각형을 그리는 둥근 모서리와 함께...이 계산할 수 있습니다 각도를 확인할 수 있게 되었습니다.

Public Sub DrawRoundRect(ByVal g As Graphics, ByVal p As Pen, ByVal x As Single, ByVal y As Single, ByVal width As Single, ByVal height As Single, ByVal radius As Single)
    Dim gp As GraphicsPath = New GraphicsPath
    gp.AddLine(x + radius, y, x + width - (radius * 2), y)
    gp.AddArc(x + width - (radius * 2), y, radius * 2, radius * 2, 270, 90)
    gp.AddLine(x + width, y + radius, x + width, y + height - (radius * 2))
    gp.AddArc(x + width - (radius * 2), y + height - (radius * 2), radius * 2, radius * 2, 0, 90)
    gp.AddLine(x + width - (radius * 2), y + height, x + radius, y + height)
    gp.AddArc(x, y + height - (radius * 2), radius * 2, radius * 2, 90, 90)
    gp.AddLine(x, y + height - (radius * 2), x, y + radius)
    gp.AddArc(x, y, radius * 2, radius * 2, 180, 90)
    gp.CloseFigure()
    g.DrawPath(p, gp)
    gp.Dispose()
End Sub

희망이 당신을 도울에서 열심히 일부의 삼각;)

url 있는 방법에 대한 설명을 그리는 둥근 사각형할 수 있도록 도와줄 수 있는 시작이다.

그러나 내가 생각하는 경우 다른 아무것도 수 있을 것 이라고 추가 더 많은 포인트를 당신의 경로를 제공하기 위해,환상의 둥근 모서리입니다.그래서 여러 지점에서 사 0,0 및 100,0.예를 들어있을 수 있습니다:

(0,0) (90,0) (95,5) (95,10) (0,100)

내가 시험하지 않는 경로는 어떤 방법으로,그냥 뽑는 숫자 작동할 수 있습기:).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top