111,128
社区成员
发帖
与我相关
我的任务
分享

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace 转角弧
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
protected override void OnPaint(PaintEventArgs e)
{
var g = e.Graphics;
var r = 20f; //端点距离
var t = 0.3; //曲率系数
var d = new Point[]
{
new Point(10, 10),
new Point(120, 200),
new Point(150, 100),
new Point(200, 110),
new Point(280, 180),
new Point(100, 230)
};
g.SmoothingMode = SmoothingMode.AntiAlias;//抗锯齿
g.DrawLines(Pens.DimGray, d); //画出折线
using (var p = new GraphicsPath())
{
p.AddLines(new Point[]{d[0], d[0]});
int i;
for (i = 1; i < d.Length-1; i++)
{
var b = new Point[4];
var dx = d[i-1].X - d[i].X;
var dy = d[i-1].Y - d[i].Y;
var k = r / Math.Sqrt(dx * dx + dy * dy);
b[0] = new Point((int)(dx * k + d[i].X), (int)(dy * k + d[i].Y));
b[1] = new Point((int)(dx * k * t + d[i].X), (int)(dy * k * t + d[i].Y));
dx = d[i + 1].X - d[i].X;
dy = d[i + 1].Y - d[i].Y;
k = r / Math.Sqrt(dx * dx + dy * dy);
b[2] = new Point((int)(dx * k * t + d[i].X), (int)(dy * k * t + d[i].Y));
b[3] = new Point((int)(dx * k + d[i].X), (int)(dy * k + d[i].Y));
p.AddBeziers(b);
}
p.AddLines(new Point[] { d[i], d[i] });
g.DrawPath(Pens.Red, p);
p.Flatten(); //曲线变折线
foreach(var x in p.PathPoints)
{
//g.DrawArc(Pens.Green, x.X - 1, x.Y - 1, 3, 3, 0, 360);//标记每个节点
}
}
}
}
}

