【Leetcode】判断平面中1个点是否落在三角形内
参考资料:
题目: https://blog.csdn.net/dongtinghong/article/details/78657403
符号重载: https://blog.csdn.net/cdlwhm1217096231/article/details/89326480#commentBox
const: https://blog.csdn.net/kaida1234/article/details/80403534
题目:
已知平面中1个点P和平面内1个三角形(3个顶点坐标A、B、C),判断该点的位置(三角形内,三角形边上,三角形外)。
三种解题思路:
1)
P点落在三角形内或者边上,P与各顶点的连线和三角形各边的夹角之和等于180°。
P点落在三角形外,P与各顶点的连线和三角形各边的夹角之和不等于180°。
2)
P点在三角形内,沿着A-B-C-A方向走,P点都在三角形边的左侧 / 右侧。
3)
选取A点作为顶点,以AB、AC边作为基,平面内所有点都可以写成 P = A + m(B-A) + n(C-A)的形式。
若 m = [0,1], n = [0,1],且m+n = 1,则该点落在三角形内部和边上。
由上式可知,AP = mAB + nAC,其中AP、AB和AC均为向量。
向量方程组:
AP AB = (mAB + nAC)AB
AP AC = (mAB + nAC)AC
解方程组得到m、n。
#include <iostream>
#include <vector> using namespace std; typedef int type; class point {
public:
point(type x_, type y_)
:x(x_), y(y_) { } point() {
x = ;
y = ;
}; friend ostream &operator<<(ostream &out, point &p); // subtract
point operator - (const point &v) const {
return point(x-v.x, y-v.y);
} // dot product
type dot(point v) {
return x*v.x + y*v.y;
} private:
type x;
type y;
}; ostream &operator<<(ostream &out, point &p) {
out << p.x << ", " << p.y;
return out;
} int wherePoint(vector<point> triP, point tar) {
point p0 = triP[];
point p1 = triP[];
point p2 = triP[];
cout << "p0 : " << p0 << endl;
cout << "p1 : " << p1 << endl;
cout << "p2 : " << p2 << endl; point l0 = p1 - p0;
point l1 = p2 - p0;
point l2 = tar - p0; type dot00 = l0.dot(l0);
type dot01 = l0.dot(l1);
type dot11 = l1.dot(l1);
type dot02 = l0.dot(l2);
type dot12 = l1.dot(l2); double temp = dot01*dot01 - dot11*dot00; double n = (dot02*dot01 - dot00*dot12) / temp; // int / int = int
if(n > || n < ) {
cout << "out of range!" << endl;
return -;
} double m = (dot02*dot11 - dot01*dot12) / temp * (-1.0);
if(m > || m < ) {
cout << "out of range!" << endl;
return -;
} if (m == || n == ) {
cout << "on the edge!" << endl;
return ;
}
if ( m+n <= 1 ){
cout << "in the range!" << endl;
return ;
}
else {
return 0;
}
} int main (int argc, char** argv){ cout << "Input 3 tri points and 1 point" << endl; vector<point> tripPoints; type a, b; for(int i = ; i < ; ++i) {
cin >> a;
cin >> b;
point p(a,b);
tripPoints.push_back(p);
} cin >> a;
cin >> b;
point target(a,b); int result = wherePoint(tripPoints, target); return ;
}
C++ 知识点:
1. const修饰成员函数。const放在函数体之前,形参之后,修饰成员函数。该成员函数不能修改对象的成员变量,也不能调用非const的成员函数。
2. const修饰函数形参。当函数形参是指针或引用变量时,const才有意义。若为普通传值形参,由于该形参是对实参的一个拷贝,在函数体内修改了形参对实参没有影响。
在重载 ”-“ 的成员函数中,底层const作用于形参上(常量引用),不能改变引用v的源值。
// subtract
point operator - (const point &v) const {
return point(x-v.x, y-v.y);
}
顶层const修饰的变量,如下所示,
const int ci = ; // 顶层const,不能修改ci
int i = ci; // 正确,当拷贝ci时,忽略ci的顶层const
int * const pi = &i; // 顶层const,不能给pi赋值
*pi = ; // 正确。顶层const,可以通过pi改变对象的内容
函数形参有顶层const修饰时,传给他常量对象或者非常量对象都是可以的。
3. 重载输出符号 <<
cin是istream类的对象,cout是ostream类的对象。如果想实现符号重载,就必须以全局函数(友元函数)的形式重载,或者到标准库中修改相应的函数定义。
ostream &operator<<(ostream &out, point &p) {
out << p.x << ", " << p.y;
return out;
}
由于上述重载函数用到了point类的private变量,因此必须在point类中将该重载函数声明为友元函数。
4. int = int / int ;
double = int / double;
【Leetcode】判断平面中1个点是否落在三角形内的更多相关文章
- 前端与算法 leetcode 387. 字符串中的第一个唯一字符
目录 # 前端与算法 leetcode 387. 字符串中的第一个唯一字符 题目描述 概要 提示 解析 解法一:双循环 解法二:Set法单循环 算法 传入测试用例的运行结果 执行结果 GitHub仓库 ...
- LeetCode.993-二叉树中的堂兄弟(Cousins in Binary Tree)
这是悦乐书的第374次更新,第401篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第235题(顺位题号是993).在二叉树中,根节点在深度0处,并且每个深度为k的节点的子 ...
- jQuery判断网页中的id是否有重复的
From:http://blog.csdn.net/china_skag/article/details/6915323判断网页中的ID是否有重复的:指定ID判断 $(function(){ $(&q ...
- 如何判断js中的数据类型?
js六大数据类型:number.string.object.Boolean.null.undefined string: 由单引号或双引号来说明,如"string" number: ...
- 如何判断js中的数据类型
如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...
- Jquery判断数组中是否包含某个元素$.inArray()的用法
判断数组里面是否包含某个元素可以使用 $.inArray("元素(字符串)",数组名称) 进行判断 ,当存在该元素(字符串)时,返回该元素在数组的下标,不存在时返回 -1 示例代码 ...
- Ifvisible.js – 判断网页中的用户是闲置还是活动状态
ifvisible.js 是一个跨浏览器.轻量级的方式,用户检查用户在浏览页面或正在与它进行交互.它可以处理活动状态,如在页面上空闲或活跃.您还可以使用 ifvisible.js 智能设置您的间隔,如 ...
- PHP判断字符串中是否包含指定字符串,支持中文哦
RT,随手写的 /** * 判断字符串中是否包含指定字符串 * @var source 源字符串 * @var target 要判断的是否包含的字符串 * @return bool */ functi ...
- [转]如何判断js中的数据类型
原文地址:http://blog.sina.com.cn/s/blog_51048da70101grz6.html 如何判断js中的数据类型:typeof.instanceof. constructo ...
随机推荐
- Linux中安装配置KVM虚拟化
KVM 概述: KVM 即 Kernel-based Virtual Machine 基于内核的虚拟机. KVM,是一个开源的系统虚拟化模块,自 Linux 2.6.20 之后集成在 Linux 的各 ...
- Linux-usermod:增加已建立用户的用户组
usermod --help -g, --gid GROUP force use GROUP as new primary group -G, --groups GROUPS new list of ...
- Integer类的常量池
- Dango之初识安装
1. MVC和MTV框架 1.1MVC Web服务器开发领域里著名的MVC模式 所谓MVC就是把Web应用分为模型(M), 控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起 ...
- 前端技术之:如何Mock GraphQL接口数据
// 第一步:引入所依赖的库const { makeExecutableSchema, addMockFunctionsToSchema } = require('graphql-tools');co ...
- Django设置 DEBUG=False后静态文件无法加载
修改setting.py STATIC_URL = '/static/' STATIC_ROOT = 'static' ## 新增行 STATICFILES_DIRS = [ os.path.join ...
- Maven项目构建利器03——第一个Maven工程
1.Maven工程的结构 我们需要通过Maven进行自动化构建, 以编译为例, Maven要想自动进行编译, 那么它必须知道Java源文件保存在哪里,所以要遵守Maven的约定,也就是约定大于配置,配 ...
- Nginx 故障实例
linux vi 操作提示 Found a swap file by the name "/usr/local/nginx/conf/.nginx.conf.swp" 解决方法: ...
- Service_Worker XSS
0x00 简介 Service Worker 是 Chrome 团队提出和力推的一个 WEB API,用于给 web 应用提供高级的可持续的后台处理能力.该 WEB API 标准起草于 2013 年, ...
- [工具] BurpSuite--快速生成CSRF POC
我们使用工具分析出存在csrf漏洞时,可以快速生成这个请求的poc,下面我们来看看怎么快速生成 0x00 上图是通过proxy,点击action,选择上图的选项即可生成这个请求的CSRF Poc了 当 ...