gpt4 book ai didi

c# - 如何在 .Net 中绘制定向线?

转载 作者:太空狗 更新时间:2023-10-30 01:10:38 26 4
gpt4 key购买 nike

关于如何在 .Net 中绘制定向线有什么建议吗?我目前正在使用 Graphics.DrawLine 和带有破折号的笔。但破折号指向两个方向。我希望它们都指向一个方向。

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);
}

最佳答案

这可能不是很有帮助,但我们在我参与的其他项目中完成此类事情的方法是实现一个自定义“笔”,它接受要绘制的线,计算实际的破折号,然后用“真正的”笔将每条破折号绘制为单独的线。如果您要执行类似的操作,那么您实际上可以将“笔”级别的 StartCap 和/或 EndCap 应用于每个破折号。

自定义“笔”必须接受破折号/间隙长度的数组或序列(或者可能是在内部解释为特定破折号/间隙长度的标准笔样式的枚举)。

很多年前,我们使用基于 GDI 的绘图系统就这样做了,在该系统中,我们必须支持比 GDI 支持的内置线型更多的线型。

这是一个有趣的练习,但它也可能比它值得的麻烦更多,除非你真的必须按照你描述的那样绘制破折号。

[编辑]

这里有一些示例代码,如果您愿意的话,可以了解如何执行此操作。

首先是 Graphics 对象的扩展方法。它需要一支笔、划线长度、间隙长度、起点和终点。它沿线 p1->p2 进行插值,绘制一个“破折号”长度段,然后跳过一个“间隙”长度段。传入的笔应该是实心的,带有箭头端盖(以达到您要求的效果)。

代码很粗糙,但行为或多或少是这样的:如果输入线比破折号和间隙的总长度短,则使用输入笔按原样绘制线。如果输入线长于破折号+间隙的总长度,则绘制“破折号”长度线,直到该线的“剩余部分”小于破折号+间隙长度,此时剩余部分按原样绘制输入笔。

如果你想实现路径绘制,那么你必须在中间顶点周围进行插值(除非你想省钱并且只为每个段独立计算破折号)。

    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);
}
}
}

你可以这样调用它:

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));
}
}

我并不是说代码很棒(甚至不一定很好 ;-),但如果您真的对绘制定向线感兴趣,它应该会给您一个很好的起点。

祝你好运!

关于c# - 如何在 .Net 中绘制定向线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4219066/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com