用位图外的点画线
Draw Line with Points outside of Bitmap
我有2个点a和b。点 a 在位图中,但点 b 不在!
显示
here.
如何计算点 c 的 x 和 y 值?
我试过这个:
double ratio = Math.Abs(a.x - b.x) / Math.Abs(a.y - b.y);
b.x = bm.Width;
b.y = a.y + 1 / ratio * Math.Abs(a.x - b.x);
Graphics.FromImage(bm).DrawLine(new Pen(Color.Gray), (float)a.x, (float)a.y, (float)b.x, (float)b.y);
但它只适用于像
these
所有其他 3 个方向都不起作用 :(
提前致谢!
首先,您不需要图像边界内的坐标来绘制一条线。您可以使用
Graphics.FromImage(bm).DrawLine(new Pen(Color.Gray), (float)a.x, (float)a.y, (float)b.x, (float)b.y);
不修改 b.
如果你真的想找到C坐标,你必须计算[A;之间的线段交叉点。 B] 和四个边缘段 [0:0 ; Width:0] [Width:0 ; Width:Height], [Width:Height ; 0:Height] 和 [0:Height ; 0:0].
这是我的一个功能(几年前创建和改编...),您可以改编(这将很容易理解什么是 Segment 结构)来检查每个线段是否有交集:
public static PointF? GetCrossingPoint(Segment segment1, Segment segment2)
{
PointF output = null;
double x1, x2, x3, x4, y1, y2, y3, y4;
x1 = segment1.StartPoint.X;
x2 = segment1.EndPoint.X;
x3 = segment2.StartPoint.X;
x4 = segment2.EndPoint.X;
y1 = segment1.StartPoint.Y;
y2 = segment1.EndPoint.Y;
y3 = segment2.StartPoint.Y;
y4 = segment2.EndPoint.Y;
double den = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
if (den != 0)
{
double t = ((x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4)) / den;
double u = -((x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3)) / den;
if (t > 0 && t < 1 && u > 0 && u < 1)
{
output = new PointF(x1 + t * (x2 - x1), y1 + t * (y2 - y1)));
}
}
return output;
}
我有2个点a和b。点 a 在位图中,但点 b 不在!
显示 here.
如何计算点 c 的 x 和 y 值?
我试过这个:
double ratio = Math.Abs(a.x - b.x) / Math.Abs(a.y - b.y);
b.x = bm.Width;
b.y = a.y + 1 / ratio * Math.Abs(a.x - b.x);
Graphics.FromImage(bm).DrawLine(new Pen(Color.Gray), (float)a.x, (float)a.y, (float)b.x, (float)b.y);
但它只适用于像 these 所有其他 3 个方向都不起作用 :(
提前致谢!
首先,您不需要图像边界内的坐标来绘制一条线。您可以使用
Graphics.FromImage(bm).DrawLine(new Pen(Color.Gray), (float)a.x, (float)a.y, (float)b.x, (float)b.y);
不修改 b.
如果你真的想找到C坐标,你必须计算[A;之间的线段交叉点。 B] 和四个边缘段 [0:0 ; Width:0] [Width:0 ; Width:Height], [Width:Height ; 0:Height] 和 [0:Height ; 0:0].
这是我的一个功能(几年前创建和改编...),您可以改编(这将很容易理解什么是 Segment 结构)来检查每个线段是否有交集:
public static PointF? GetCrossingPoint(Segment segment1, Segment segment2)
{
PointF output = null;
double x1, x2, x3, x4, y1, y2, y3, y4;
x1 = segment1.StartPoint.X;
x2 = segment1.EndPoint.X;
x3 = segment2.StartPoint.X;
x4 = segment2.EndPoint.X;
y1 = segment1.StartPoint.Y;
y2 = segment1.EndPoint.Y;
y3 = segment2.StartPoint.Y;
y4 = segment2.EndPoint.Y;
double den = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
if (den != 0)
{
double t = ((x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4)) / den;
double u = -((x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3)) / den;
if (t > 0 && t < 1 && u > 0 && u < 1)
{
output = new PointF(x1 + t * (x2 - x1), y1 + t * (y2 - y1)));
}
}
return output;
}