计算机图形学押题(更新中...)

已经形成了某多面体的顶点表 边表和面表,怎样写程序检查三张表中的整体一致性

平面上有多个红点和多个蓝点,问是否存在一条直线,能够让所有红点在一侧,蓝点在另一侧.请设计一个算法判断.

设空间有两条线段AB和CD,其端点坐标分别为imgimgimgimg,怎样判断它们是否相交?若相交,求出交点坐标。

写一个算法,能迅速地判断一条直线与一个凸多边形是否相交,若相交求出交点。

*解答:*

设直线由两点imgimg确定,凸多边形由顶点序列imgimg···img(共n个顶点)确定。

算法的基本思想是:取多边形一条边,判断该边的两个端点是否在直线的同侧,如果在同侧,则该边与直线无交点;如果两个端点在直线的异侧,则线段与直线有交点,计算交点。依次检查多边形的所有边即可求出多边形与直线的所有交点,因为是凸多边形,所以交点最多有两个,算法可以在求出两个交点后就停止。判断点在直线的那一侧可使用第四节第二部分中介绍的方法,计算交点采用第一节中介绍的线段求交点中使用的方法。

算法具体过程如下:

(1) 首先计算A=y2-y1;B=x1-x2;C=x2y1-x1y2;

(2) 取多边形的P0点为P1,计算d1=AP1.x+Bp1.y+C

(3) for (i=1; i<=n; i++)

扫描二维码关注公众号,回复: 7986494 查看本文章

{

1) 取多边形的下标为i%n的点为P2(这样可以在i=n时取P0点);

2) 计算d2=Ap2.x+Bp2.y+C

3) if (d1==0),表明P1点在直线上,P1点是一个交点;

4) else if (d1*d2<0),表明P1和P2点在直线的异侧,该边与直线有交点,计算交点:

delta = (p2.x - p1.x) * (y1 - y2) - (x1 - x2) * (p2.y - p1.y);

t = ((x1 - p1.x) * (y1 - y2) - (y1 - p1.y) * (x1 - x2)) / delta;

交点jdp的x,y坐标值分别为:

x = p1.x + (p2.x - p1.x) * t;

y = p1.y + (p2.y - p1.y) * t

5) 如果已经求得两个交点,则算法结束,否则令p1=p2,d1=d2;

}

(4) 如果没有求出交点,则直线与多边形不相交。

该算法当直线与多边形的一条边重合时,将该边的两个端点作为交点。

算法实现代码如下:

void CHW1View::GetJD(CArray<CPoint,CPoint>* points, int x1, int y1, int x2, int y2, CArray<CPoint,CPoint>* jd)
{
    int d1,d2;
    int a = y2 - y1;
    int b = x1 - x2;
    int c = x2*y1 - x1*y2;
    CPoint p1 = (CPoint)points->GetAt(0);
    CPoint p2;
    d1 = a * p1.x + b * p1.y + c;
    int n = points->GetSize();
    for (int i=1;i<=n;i++)
    {
        p2 = (CPoint)points->GetAt(i%n);
        d2 = a * p2.x + b * p2.y + c;
        if (d1 == 0)
        {
            jd->Add(p1);
        }
        else if ((d1<0 && d2>0) || (d1>0 && d2<0))
        {
            double delta = (p2.x - p1.x) * (y1 - y2) - (x1 - x2) * (p2.y - p1.y);
            double t = ((x1 - p1.x) * (y1 - y2) - (y1 - p1.y) * (x1 - x2)) / delta;
            CPoint jdp;
            jdp.x = (int)(p1.x + (p2.x - p1.x) * t);
            jdp.y = (int)(p1.y + (p2.y - p1.y) * t);
            jd->Add(jdp);
        }
        if (jd->GetSize() == 2) return;
        p1 = p2;d1 = d2;
    }
}

代码中points存放多边形顶点坐标,jd存放计算得到的交点坐标,x1,y1,x2,y2为直线上的两点坐标。

如果有n条线段只想判断是否相交,并不要求计算出所有交点,那么应该如何简化?

3.n条线段的集合S,是否有一条直线能与S所有线段都相交

4.平面最近点对

1.若平面多边形不相邻的边没有公共点,则称多边形是简单的,求一个简单多边形算法

2.算法判断是不是凸多边形,如果不是,分解为多个凸多边形

1.三维Jarvis

线性四叉树 与 规则四叉树互相转化

八叉树求交求并的程序

猜你喜欢

转载自www.cnblogs.com/Tony100K/p/11938549.html
今日推荐