给定2d空间中的一组行,如何截断它们在边界内?

时间:2018-06-06 20:22:50

标签: math go geometry line

背景

部屋!我试图生成一块印有旧金山子集的电路板。大部分内容都已完成,我生成的图像看起来像这样:

Rendered San Francisco

问题在于我渲染的线条延伸到我的硬编码截止边界之外(我正在渲染一边是一边而一边是边界的线)。

问题:

给出一组这样的行:

# x1,y1,  x2,y2
10,10,40,40
80,80,120,120

我如何修改每一行的坐标,以便它们切断'在一个特定的界限?

在上面的例子中,第二行(原始形式)延伸到(120,120),应该只延伸到(100,100),假定边界为100,100。

思想

基于我从高中数学中记得的东西,我应该在公式中插入一些东西y=mx+b是吗?即便如此,我将如何处理无限的渐变等?

感谢任何和所有的帮助:D Puesdocode / python / Go首选,但解释就像慷慨接受。

< 3 汤姆

2 个答案:

答案 0 :(得分:1)

你最好的朋友是Cohen-Sutherland线裁剪算法。

https://en.wikipedia.org/wiki/Cohen%E2%80%93Sutherland_algorithm

答案 1 :(得分:0)

坐下来解决它。我的基本方法是:

  1. 计算线的斜率& y-intercept
  2. 检查所有四个边上的两个点以查看它们是否超出边界,如果是,则通过将边界插入公式y=mx+b来重新计算必要的坐标。
  3. 这是我的Go代码:

    func boundLine(line *kcgen.Line) {
    if line.Start.X == line.End.X {
        panic("infinite slope not yet supported")
    }
    slope := (line.End.Y - line.Start.Y) / (line.End.X - line.Start.X)
    b := line.End.Y - (slope * line.End.X) //y = mx + b which is equivalent to b = y - mx
    if line.Start.X < (-*width/2) {
        line.Start.Y = (slope * (-*width/2)) + b
        line.Start.X = -*width/2
    }
    if line.End.X < (-*width/2) {
        line.End.Y = (slope * (-*width/2)) + b
        line.End.X = -*width/2
    }
    if line.Start.X > (*width/2) {
        line.Start.Y = (slope * (*width/2)) + b
        line.Start.X = *width/2
    }
    if line.End.X > (*width/2) {
        line.End.Y = (slope * (*width/2)) + b
        line.End.X = *width/2
    }
    
    if line.Start.Y < (-*height/2) {
        line.Start.Y = -*height/2
        line.Start.X = ((-*height/2) - b) / slope //y = mx + b equiv. (y-b)/m = x
    }
    if line.End.Y < (-*height/2) {
        line.End.Y = -*height/2
        line.End.X = ((-*height/2) - b) / slope //y = mx + b equiv. (y-b)/m = x
    }
    if line.Start.Y > (*height/2) {
        line.Start.Y = *height/2
        line.Start.X = ((*height/2) - b) / slope //y = mx + b equiv. (y-b)/m = x
    }
    if line.End.Y > (*height/2) {
        line.End.Y = *height/2
        line.End.X = ((*height/2) - b) / slope //y = mx + b equiv. (y-b)/m = x
    }
    }