.NET GDI+:그림 라인으로 둥근 모서리
-
05-07-2019 - |
문제
주어진 배열의 포인트,그것은 쉬운 라인을 그리는 이를 기반으로,예를 들어,를 사용하 GraphicsPath 클래스입니다.
예를 들어,다음과 같은 편의 포인트를...
[0]: (0,0)
[1]: (100,0)
[2]: (0,100)
[3]: (100,100)
...설명합니다 라인을 닮 Z.
하지만 여기에 도전;필요해요 그리는 둥근 모서리의 반경어10 픽셀이 있습니다.에 의해 모서리를 내 말은 지점에는 선지 않을 시작 또는 끝 지점.이 경우에 있는 두 개의 모서리 (0,100)
고 (100,0)
.
사진 베지 곡선과 호,일부 의 수있는 보유 솔루션-I 수 없었던 그것을 찾기 위해 자신을 아직,이후를 처리할 수 있 라인을 그려진 모든 각도에서,단지 수평 또는 수직 라인입니다.
설정 LineJoin
의 Pen
체 Round
지 않는 충분한 이후,이것을 보여줍와 더 넓은 펜입니다.
편집: 을 명확히,나는 잘 알고 있의 베지,곡선과 호의 기능을 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)
내가 시험하지 않는 경로는 어떤 방법으로,그냥 뽑는 숫자 작동할 수 있습기:).