首页 > 其他分享 >计算几何~三角形面积、点在三角形内、线段相交代码笔记

计算几何~三角形面积、点在三角形内、线段相交代码笔记

时间:2025-01-17 20:58:27浏览次数:3  
标签:p1 const double 线段 笔记 points return 三角形 Point2D

多边形面积的基本公式:

鞋带公式 。强调多边形点集是按顺序存储;

三角形面积基本公式:

海伦公式;

向量叉积公式;

拓扑关系判断:

判断点是否在三角形内;

判断两条线段是否相交;

代码笔记:

#pragma once
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <limits>

struct Point2D {
	double x;
	double y;
	Point2D(double x, double y) : x(x), y(y) {}
	bool operator ==(const Point2D& p) {
		if (x == p.x && y == p.y) return true;
		return false;
	}
};

// 鞋带公式  注意多边形点集是按顺序存储
double computeArea(const std::vector<Point2D> &points)
{
	int n = points.size();
	double area = 0.00;
	for (int i = 0; i < n; ++i) {
		int j = (i + 1) % n;
		area += (points[i].x * points[j].y - points[j].x * points[i].y);
	}
	return abs(area * 0.5);
}

double distance2(const Point2D& p1, const Point2D& p2)
{
	double dx = p1.x - p2.x;
	double dy = p1.y - p2.y;
	return std::sqrt(dx*dx + dy*dy);
}

// 三角形海伦公式
double computeTriangleArea(const std::vector<Point2D> &points)
{
	int n = points.size();
	if (n != 3) { return 0.0; }
	double a = distance2(points[0], points[1]);
	double b = distance2(points[1], points[2]);
	double c = distance2(points[0], points[2]);
	double s = (a + b + c)* 0.5;
	return sqrt(s *(s - a) * (s - b) * (s - c));
}

// 三角形面积 S = 0.5*|(x2-x1)(y3-y1)-(x3-x1)(y2-y1)|
double computeTriangleArea2(const std::vector<Point2D> &points)
{
	int n = points.size();
	if (n != 3) { return 0.0; }
	return 0.5 * abs((points[1].x - points[0].x) * (points[2].y - points[0].y) - (points[2].x - points[0].x) * (points[1].y - points[0].y));
}

// 判断点是否在三角形内:1.面积法;2.同向法(向量叉乘符号相同);3.射线法;4.重心坐标法(a+b+c=1)
double crossProduct(const Point2D& o,const Point2D& p1, const Point2D& p2)
{
	return (p1.x-o.x) * (p2.y-o.y) - (p1.y-o.y) * (p2.x-o.x);
}

bool point2DInTriangle(const Point2D& p, const Point2D& a, const Point2D& b, const Point2D& c)
{
	double crossAB_AP = crossProduct(a,b,p);
	double crossBC_BP = crossProduct(b,c,p);
	double crossCA_CP = crossProduct(c,a,p);
	return (crossAB_AP >= 0 && crossBC_BP >= 0 && crossCA_CP >= 0) ||
		(crossAB_AP <= 0 && crossBC_BP <= 0 && crossCA_CP <= 0);
}

// 判断两条线段AB与CD是否相交
bool segmentIntersect(const Point2D& a, const Point2D& b, const Point2D& c, const Point2D& d)
{
	double crossAB_AC = crossProduct(a, b, c);
	double crossAB_AD = crossProduct(a, b, d);
	double crossCD_CA = crossProduct(c, d, a);
	double crossCD_CB = crossProduct(c, d, b);
	return (crossAB_AC * crossAB_AD <= 0) && (crossCD_CA * crossCD_CB <= 0);
}

标签:p1,const,double,线段,笔记,points,return,三角形,Point2D
From: https://blog.csdn.net/qq_37242131/article/details/145214471

相关文章

  • THREE.js学习笔记8——Textures
    这个小节主要学习纹理,Texture纹理是覆盖几何形状表面的图像,不同类型的纹理具有多种不同的效果。这些纹理(尤其是金属性和粗糙度)遵循PBR原则基于物理的渲染许多技术往往遵循现实生活中的方向以获得现实的结果成为现实渲染的标准许多软件、引擎和库都在使用它如何加载纹理?......
  • 机器学习笔记合集
    大家好,这里是好评笔记,公主号:Goodnote。本笔记的任务是解读机器学习实践/面试过程中可能会用到的知识点,内容通俗易懂,入门、实习和校招轻松搞定。笔记介绍本笔记的任务是解读机器学习实践/面试过程中可能会用到的知识点,内容通俗易懂,入门、实习和校招轻松搞定。涵盖机器......
  • Java初学者笔记-03、代码块内部类函数式编程
    代码块静态代码块static{}类加载时自动执行,类只会加载一次,静态代码块只会执行一次,往往用来对类的静态资源的初始化。实例代码块{},每次创建对象时执行,用来完成对象的初始化的。内部类一个类定义在另一个类内部,叫做内部类。使用场景:当一个类的内部,包含了一个完整的事物,且......
  • Vulnhub-Tr0ll靶机笔记
    Tr0ll靶机笔记概述靶机地址:https://www.vulnhub.com/entry/tr0ll-1,100/这台靶机比较简单,让我们开始Hackit!一、nmap扫描1、端口扫描sudonmap-sT--min-rate10000-p-192.168.52.6-oportsNmapscanreportfor192.168.52.6Hostisup(0.0026slatency).Notsh......
  • Java初学者笔记-03、代码块内部类函数式编程
    代码块静态代码块static{}类加载时自动执行,类只会加载一次,静态代码块只会执行一次,往往用来对类的静态资源的初始化。实例代码块{},每次创建对象时执行,用来完成对象的初始化的。内部类一个类定义在另一个类内部,叫做内部类。使用场景:当一个类的内部,包含了一个完整的事物,且......
  • [RHCE学习笔记]RedHat 使用sshd服务远程连接服务器
    目录前言理论加密技术原理连接远程服务器的过程                                 版本协商阶段 密钥和算法协商阶段 认证阶段实操实验一修改ssh服务端口号实验二拒绝root用户登录实验三允......
  • Docker Compose 笔记
    目录Docker-Compose简介DockerCompose的定义和目的Docker-Compose用来实现Docker容器快速编排Docker-Compose模板文件简介eg:Docker-Compose的编排处出来的部署架构Docker-Compose的编排结构安装Docker-Compose验证Docker-compose是否安装成功卸载dockercompose:Dockerc......
  • Docker 笔记
    目录Docker的基本组成镜像(image):容器(container):仓库(repository):Dcoker安装1、卸载系统之前的docker2、安装Docker-CE安装必须的依赖设置dockerrepo的yum位置查看选择docker-ce各版本安装docker,以及docker-cli3、启动docker4、设置docker开机自启5、测试docker常......
  • 前端 http学习笔记
    1.http全称是HyperTextTransferProtocol超文本传输协议2.TCP/IP协议栈分为应用层,传输层,网络层,数据链路层。HTTP工作在应用层。底层数据传输由TCPUDP负责3.HTTP的版本1.最常用的是HTTP/1.1 HTTP/2HTTP/32.HTTP/1.1依然在被广泛使用, http/2引入了多路复用,二进制帧......
  • juju的电脑基本操作学习笔记_打开CMD与bash命令
    juju的电脑基本操作学习笔记_打开CMD与bash命令普普通通滴打开CMD方式一:任务栏搜索CMD方式二:按住win+R打开运行在里面输入cmd方式三:在文件夹的任何一个位置单击右键,选择Openinterminal方式四:在资源管理器的地址栏的最前面加上cmd空格再回车以管理员方式运行CMD常用的b......