论坛首页 Web前端技术论坛

图形间连线算法

浏览 18220 次
精华帖 (0) :: 良好帖 (10) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-04-10  
如何实现两方形间连线的算法,使得线的两端正好是与方形各边的交点。
在方形变换位置的时候交点也可以跟着变化

条件:方形的长、宽、坐标、中心点都是已知的
如图:
  • 大小: 1.8 KB
   发表时间:2008-04-10  
html画线?
0 请登录后投票
   发表时间:2008-04-10  
这里似乎没有讨论图形学的。

http://xyz20003.iteye.com/blog/149102
我自己做了一个连线的,写得不好,参考参考
0 请登录后投票
   发表时间:2008-04-10  
xyz20003 写道
这里似乎没有讨论图形学的。

http://xyz20003.iteye.com/blog/149102
我自己做了一个连线的,写得不好,参考参考

是html的 我其它的都实现了,现在是把线连在了每个图形的中点。
由于怕以后画图的时候,一个图形连的线太多看上去会不好看。
所以现在想改成这样的。想了2天了还是想不出来
0 请登录后投票
   发表时间:2008-04-10  
图形是vml画的
0 请登录后投票
   发表时间:2008-04-10  
我用svg画的,firefox-2以上就可以跑起来,
计算中心位置,求连线,然后判断与矩形边缘相交,取交点,然后描绘两交点之间的连线,我的想法很直接,很老土。

有个问题就是两个矩形相交的时候,这种求法会出错。
0 请登录后投票
   发表时间:2008-04-10  
xyz20003 写道
我用svg画的,firefox-2以上就可以跑起来,
计算中心位置,求连线,然后判断与矩形边缘相交,取交点,然后描绘两交点之间的连线,我的想法很直接,很老土。

有个问题就是两个矩形相交的时候,这种求法会出错。

我现在就是算不出那个交点,数学不好
你的那个交点是怎么算出来的
0 请登录后投票
   发表时间:2008-04-10  
    private void initBeginAndEnd() {
        double fromX = from.getX();
        double fromY = from.getY();
        double fromW = from.getW();
        double fromH = from.getH();
        double toX = to.getX();
        double toY = to.getY();
        double toW = to.getW();
        double toH = to.getH();

        double xx1 = fromX + (fromW / 2);
        double yy1 = fromY + (fromH / 2);
        double xx2 = toX + (toW / 2);
        double yy2 = toY + (toH / 2);

        if (from != to) {
            Line fromLine = new Line(xx1, yy1, xx2, yy2);
            Rect fromRect = new Rect(fromX, fromY, fromW, fromH);
            Point fromCrossPoint = fromRect.getCrossPoint(fromLine);

            if (fromCrossPoint != null) {
                this.x1 = fromCrossPoint.getX();
                this.y1 = fromCrossPoint.getY();
            } else {
                this.x1 = xx1;
                this.y1 = yy1;
            }

            Line toLine = new Line(xx1, yy1, xx2, yy2);
            Rect toRect = new Rect(toX, toY, toW, toH);
            Point toCrossPoint = toRect.getCrossPoint(toLine);

            if (toCrossPoint != null) {
                this.x2 = toCrossPoint.getX();
                this.y2 = toCrossPoint.getY();
            } else {
                this.x2 = xx2;
                this.y2 = yy2;
            }
        } else {
            this.x1 = xx1;
            this.y1 = yy1;
            this.x2 = xx2;
            this.y2 = yy2;
        }
    }


0 请登录后投票
   发表时间:2008-04-10  
xyz20003 写道
    private void initBeginAndEnd() {
        double fromX = from.getX();
        double fromY = from.getY();
        double fromW = from.getW();
        double fromH = from.getH();
        double toX = to.getX();
        double toY = to.getY();
        double toW = to.getW();
        double toH = to.getH();

        double xx1 = fromX + (fromW / 2);
        double yy1 = fromY + (fromH / 2);
        double xx2 = toX + (toW / 2);
        double yy2 = toY + (toH / 2);

        if (from != to) {
            Line fromLine = new Line(xx1, yy1, xx2, yy2);
            Rect fromRect = new Rect(fromX, fromY, fromW, fromH);
            Point fromCrossPoint = fromRect.getCrossPoint(fromLine);

            if (fromCrossPoint != null) {
                this.x1 = fromCrossPoint.getX();
                this.y1 = fromCrossPoint.getY();
            } else {
                this.x1 = xx1;
                this.y1 = yy1;
            }

            Line toLine = new Line(xx1, yy1, xx2, yy2);
            Rect toRect = new Rect(toX, toY, toW, toH);
            Point toCrossPoint = toRect.getCrossPoint(toLine);

            if (toCrossPoint != null) {
                this.x2 = toCrossPoint.getX();
                this.y2 = toCrossPoint.getY();
            } else {
                this.x2 = xx2;
                this.y2 = yy2;
            }
        } else {
            this.x1 = xx1;
            this.y1 = yy1;
            this.x2 = xx2;
            this.y2 = yy2;
        }
    }



谢谢你的共享精神
这个是把线的两端分别连在了图形的中心点了吧
我要的是线和图形边的交点
0 请登录后投票
   发表时间:2008-04-10  
搜索下 Manhattan Router 算法不难的
0 请登录后投票
论坛首页 Web前端技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics