【问题标题】:Draw a parallel line画一条平行线
【发布时间】:2019-12-13 06:44:59
【问题描述】:

我有 x1,y1 和 x2,y2 形成一条线段。我怎样才能得到另一条线 x3,y3 - x4,y4 与图片中的第一条线平行。我可以简单地将 n 添加到 x1 和 x2 以获得平行线,但这不是我想要的。我希望线条在图片中保持平行。

【问题讨论】:

    标签: c# graphics geometry drawing computational-geometry


    【解决方案1】:

    您要做的是在正交方向上偏移坐标。如果您知道向量数学,请将线端点之间的距离创建的向量乘以以下矩阵:

    [ 0 -1 ]
    [ 1  0 ]
    

    假设第一行有(x1,y1)、(x2,y2)、x=x2-x1、y=y2-y1。
    我们还有L = sqrt(x*x+y*y),行的长度(请原谅符号)。那么下一行应该偏移

    [ 0 -1 ] [x]
    [ 1  0 ] [y]
    

    => dx = -y / L, dy = x / L 这是新行的标准化偏移量。

    类似 C# 的伪代码:

    var x1 = ..., x2 = ..., y1 = ..., y2 = ... // The original line
    var L = Math.Sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
    
    var offsetPixels = 10.0
    
    // This is the second line
    var x1p = x1 + offsetPixels * (y2-y1) / L
    var x2p = x2 + offsetPixels * (y2-y1) / L
    var y1p = y1 + offsetPixels * (x1-x2) / L
    var y2p = y2 + offsetPixels * (x1-x2) / L
    
    g.MoveTo(x1p,y1p) // I don't remember if this is the way
    g.LineTo(x2p,y2p) // to draw a line in GDI+ but you get the idea
    

    【讨论】:

    • 实际上,我不知道向量数学。您能否编写一个 C# 或伪函数来实现您所说的?
    • 搞定了。但是还有一个问题,如果我想从原线偏移 10 个像素,我应该乘 dx * 10 吗?
    • 您先生刚刚让我免于重新学习几何!继续努力!
    • 这可以节省时间——想知道如何在 Qt 中使用 QTransform(我只是不明白),但是这种蛮力方法效果很好。
    • @Krumelur 如果我有曲折线,那么这条线的逻辑是什么。?是一样的还是要找两条连线的天使?
    【解决方案2】:

    您是否尝试在 y1 和 y2 中减去 n,同时在 x1 和 x2 中添加 n?我想这可能有效

    【讨论】:

    • 当直线为 90 度或 180 度时,减去 y1 和 y2 不起作用。
    • 也许你可以设置边缘条件,即检查 y1,y2 是否为零。
    • @Krumelur 的方法不需要检查边缘。 ;)
    猜你喜欢
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多