用位图外的点画线

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