不规则三角网 Delaunay——TIN

http://blog.csdn.net/u010025211/article/details/25032209

开源库:http://www.cs.cmu.edu/~quake/triangle.html

下载地址: 链接:http://pan.baidu.com/s/1jIlxK6U 密码:2xgg

知识点一:平面中判断一个点是否在三角形内部。

#include <stdio.h>
//m,n表示待检测点的x,y坐标,a,b,c表示三角形的三个点
bool isInTriangle(double m,double n,double ax,double bx,double cx,double ay,double by,double cy) 
{
    double u = (m-ax)*(by-ay)-(n-ay)*(bx-ax);
    u/=(cx-ax)*(by-ay)-(cy-ay)*(bx-ax);
    double v = (m-ax)*(cy-ay)-(n-ay)*(cx-ax);
    v/=(bx-ax)*(cy-ay)-(by-ay)*(cx-ax);
    return u>0&&v>0&&(u+v)<=1;
}
int main(void) {

    bool answer = true;
    answer = isInTriangle(0.5,0.7,0,0,1,1,0,0);

    printf("%s\n", answer?"Point is in triangle.":"Points isn't in triangle.");

    answer = isInTriangle(0.5,0.3,0,0,1,1,0,0);
    printf("%s\n", answer?"Point is in triangle.":"Points isn't in triangle.");
    
}

 知识点二、判断一点是否在三角形的外接圆内

      1、外接圆的圆心

#include <stdio.h>

void getCenterOfCircle(double &x,double &y,double x1,double x2,double x3,double y1,double y2,double y3)
{
    x=(x2*x2-x1*x1+y2*y2-y1*y1)*(y3-y1)-(x3*x3-x1*x1+y3*y3-y1*y1)*(y2-y1);
    x/=2*(x2-x1)*(y3-y1)-2*(x3-x1)*(y2-y1);    
    y=(x2*x2-x1*x1+y2*y2-y1*y1)*(x3-x1)-(x3*x3-x1*x1+y3*y3-y1*y1)*(x2-x1);
    y/=2*(y2-y1)*(x3-x1)-2*(y3-y1)*(x2-x1);
} 
int main(void) {

    bool answer = true;
    
    double x=0,y=0;
    getCenterOfCircle(x,y,0,3,3,4,4,0);
    
    printf("%f %f\n", x,y);
    
}

    2.判断点(m,n)是否在三角形的外接圆内

#include <stdio.h>

void getCenterOfCircle(double &x,double &y,double x1,double x2,double x3,double y1,double y2,double y3)
{
    x=(x2*x2-x1*x1+y2*y2-y1*y1)*(y3-y1)-(x3*x3-x1*x1+y3*y3-y1*y1)*(y2-y1);
    x/=2*(x2-x1)*(y3-y1)-2*(x3-x1)*(y2-y1);    
    y=(x2*x2-x1*x1+y2*y2-y1*y1)*(x3-x1)-(x3*x3-x1*x1+y3*y3-y1*y1)*(x2-x1);
    y/=2*(y2-y1)*(x3-x1)-2*(y3-y1)*(x2-x1);
} 
bool isInCircumcircle(double m,double n,double x1,double x2,double x3,double y1,double y2,double y3)
{
    double x=0;
    double y=0;
    getCenterOfCircle(x,y,x1,x2,x3,y1,y2,y3);
    return (m-x)*(m-x)+(n-y)*(n-y)<=(x1-x)*(x1-x)+(y1-y)*(y1-y);
}
int main(void) {
    
    double x=0,y=0;
    bool answer = true;
    answer = isInCircumcircle(0,-1,0,3,3,4,4,0);    
     printf("%s\n", answer?"Point is in Circumcircle.":"Points isn't in Circumcircle.");
}

 

转载于:https://www.cnblogs.com/lwngreat/p/4630593.html

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
不规则三角网TIN)生成算法是一种用于创建三维地形表面模型的算法。它适用于任意形状和大小的地形数据,并可以应用于地理信息系统(GIS)、计算机图形学、地理建模等领域。 TIN生成算法的基本步骤如下: 1. 创建点集:首先,根据输入的地形数据,提取出一系列离散的地形点。这些点通常是有高程信息的点集,可以是从数字高程模型(DEM)中提取得到的。 2. 创建三角形:然后,利用三角化算法,将点集连接成不规则三角网。一个常用的三角化算法是Delaunay三角化,它保证了生成的三角形格的质量较高,即每个三角形的内角较接近于等边三角形的角度,减少了扭曲程度。 3. 约束条件:在生成的三角形上,可以添加一些约束条件,如边界约束、附加约束等。这些约束条件可以通过调整三角形的边长、角度或高程信息,以满足特定的要求。 4. 格优化:对生成的三角形进行优化,使得各个三角形的质量更加均衡。常用的优化方法有重心法、最小二乘法等。这些方法通过调整三角形的顶点位置,使得整个格更加平滑和自然。 5. 结果输出:最后,将生成的TIN作为地形模型的表面表示输出。可以将TIN保存为三角形格文件,或者将其渲染成二维或三维视图,以便进行进一步的地形分析或可视化。 总之,不规则三角网生成算法是一种用于创建地形表面模型的高效方法。它通过离散的点集和三角化算法生成不规则三角面片,并通过约束条件和格优化来改善模型的质量。该算法可应用于不同的领域,为地理信息处理和地形建模提供了有力支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值