【问题标题】:Drawing N-width lines?绘制 N 宽线?
【发布时间】:2010-06-05 20:13:10
【问题描述】:

给定一系列点,我如何计算 5 像素外那条线的矢量?前任: 给定:

   \
    \
     \

我怎样才能找到向量

   \  \
    \  \
     \  \

右边的那些。

我正试图弄清楚像 Flash 这样的程序如何制作粗轮廓。

谢谢

【问题讨论】:

  • 根据定义,向量始终是一条漂亮的直线……它甚至是一条无限长的漂亮直线。另外,五个像素在哪个方向?在右边?沿着法线到第一行?
  • 这是作业还是个人项目?
  • 如果原来的线段系列不是只是一条垂直线,你会怎么做?
  • 个人项目,我正在制作矢量图应用
  • 您的示例不是一系列点,而是以线开头。你能澄清一下吗?

标签: c++ c algorithm drawing


【解决方案1】:

粗线是多边形。 (让我们暂时忘记抗锯齿)

picture http://img39.imageshack.us/img39/863/linezi.png

开始 = 线开始 = 向量(x1, y1)
end = 线 end = 矢量(x2, y2)
dir = 线方向 = 结束 - 开始 = 矢量(x2-x1, y2-y1)
ndir = 归一化方向 = dir*1.0/length(dir)
perp = 垂直于方向 = 矢量(dir.x, -dir.y)
nperp = 归一化垂直 = perp*1.0/length(perp)

perpoffset = nperp*w*0.5
diroffset = ndir*w*0.5

(您可以轻松地删除一个归一化并通过从另一个取垂直来计算其中一个偏移量)

p0、p1、p2、p3 = 多边形点:
p0 = 开始 + perpoffset - diroffset
p1 = 开始 - perpoffset - diroffset
p2 = end + perpoffset + diroffset
p3 = end - perpoffset + diroffset

附:你是我要解释这些东西的最后一个人。 应该在直观的层面上理解这些事情。

【讨论】:

  • 非常感谢,我非常感谢这个解释,尽管我在高中学习了代数 1 和 2 和物理,但我仍然对这些东西感到困惑......
【解决方案2】:

做直线的方法是找到与原直线垂直 (N) 的直线,沿该方向走 5 个像素,然后找到与该点垂线的垂线

  |     |
--+-----+---N
  |     |
  |     |

使用非直线的方法是用许多直线来近似它,或者如果你有直线的解析表示,以类似于直线的方式找到某种解析解.

【讨论】:

    【解决方案3】:

    试试这个未经测试的伪代码:

    # Calculate the "Rise" and "run" (slope) of your input line, then 
    # call this function, which returns offsets of x- and y-intercept
    # for the parallel line.  Obviously the slope of the parallel line
    # is already known: rise/run.
    
    # returns (delta_x, delta_y) to be added to intercepts.  
    adjacent_parallel(rise, run, distance, other_side):
        negate = other_side ? -1 : 1
        if rise == 0:
            # horizontal line; parallel is vertically away
            return (0, negate * distance)
        elif run == 0:
            # vertical line; parallel is horizontally away
            return (negate * distance, 0)
        else:
            # a perpendicular radius is - run / rise slope with length
            # run^2 + rize^2 = length  ^ 2
            nrml = sqrt(run*run + rise*rise)
            return (negate * -1 * run / nrml, negate * rise/nrml)
    

    正如 SigTerm 在他漂亮的图表中显示的那样,您将希望获得预期线两侧的线:因此传入 thickness/2 以获取距离并调用两次,一次使用 other_side=true,并以'抽象线'。

    【讨论】:

      【解决方案4】:

      你需要有一些数学背景。

      首先了解line(线性方程和线性函数)什么是parallel,并从查找几何transformations 中受益。

      之后你就会明白SigTerm的回答了……

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-24
        • 1970-01-01
        相关资源
        最近更新 更多