gpt4 book ai didi

c# - 将一条线缩短若干像素

转载 作者:可可西里 更新时间:2023-11-01 08:18:37 24 4
gpt4 key购买 nike

我正在使用 .NET GDI+ 绘制业务对象的自定义图表。除其他外,图表由连接对象的几条线组成。

在特定情况下,我需要将一条线缩短特定数量的像素,比方说 10 个像素,即找到位于线终点前 10 个像素的线上的点。

想象一个半径为 r = 10 像素的圆,以及一条起点为 (x1, y1) 和终点为 (x2, y2) 的线。圆以直线的终点为中心,如下图所示。

Illustration

如何计算标有红色圆圈的点,即圆与直线的交点?这将为我提供直线的新终点,将其缩短 10 个像素。


解决方案

感谢您的回答,使我能够整理出以下程序。我将其命名为 LengthenLine,因为我发现如果我想要缩短线条,传递负数像素更自然。

具体来说,我试图将一个可以绘制圆角线的函数放在一起,可以找到here。 .

public void LengthenLine(PointF startPoint, ref PointF endPoint, float pixelCount)
{
if (startPoint.Equals(endPoint))
return; // not a line

double dx = endPoint.X - startPoint.X;
double dy = endPoint.Y - startPoint.Y;
if (dx == 0)
{
// vertical line:
if (endPoint.Y < startPoint.Y)
endPoint.Y -= pixelCount;
else
endPoint.Y += pixelCount;
}
else if (dy == 0)
{
// horizontal line:
if (endPoint.X < startPoint.X)
endPoint.X -= pixelCount;
else
endPoint.X += pixelCount;
}
else
{
// non-horizontal, non-vertical line:
double length = Math.Sqrt(dx * dx + dy * dy);
double scale = (length + pixelCount) / length;
dx *= scale;
dy *= scale;
endPoint.X = startPoint.X + Convert.ToSingle(dx);
endPoint.Y = startPoint.Y + Convert.ToSingle(dy);
}
}

最佳答案

找到方向向量,即让位置向量为(使用 float )B = (x2, y2) 和 A = (x1, y1),然后 AB = B - A。通过除以其长度( Math.Sqrt(xx + yy) )。然后将方向向量AB乘以原长度减去圆的半径,加回到直线起始位置:

double dx = x2 - x1;
double dy = y2 - y1;
double length = Math.Sqrt(dx * dx + dy * dy);
if (length > 0)
{
dx /= length;
dy /= length;
}
dx *= length - radius;
dy *= length - radius;
int x3 = (int)(x1 + dx);
int y3 = (int)(y1 + dy);

编辑:修复了代码,aa 并修复了最初的解释(认为您希望直线从圆的中心到圆周:P)

关于c# - 将一条线缩短若干像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1866903/

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