【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 ...
随机推荐
- python 并发编程 协程 greenlet模块
一 greenlet模块 不敢是yield,还是greenlet都没有实现检测io,实现遇到io切换效果 如果我们在单个线程内有20个任务,要想实现在多个任务之间切换,使用yield生成器的方式过于麻 ...
- 第六周作业&实验报告四
一.实验目的 (1)掌握类的继承 (2)变量的继承和覆盖,方法的继承,重载和覆盖的实现: 二.实验的内容 (1)根据下面的要求实现圆类Circle. 1.圆类Circle的成员变量:radius表示圆 ...
- python之入门
第一章 入门 1.1 变量-输出 a = 1 # 声明变量 a # 变量的名字 = # 赋值 1 # 值 变量定义的规则: 1.变量由数字,字母,下划线组成 2.不能以数字开头 3.不能使用pytho ...
- 解决Asp.net Core中chtml文档中文乱码的问题
原因 由于Visual Studio 2017在保存chtml时,文本格式非utf-8,所以导致中文会出现乱码情况. 解决办法 在工具->扩展与更新中添加插件"ForceUTF8 (w ...
- php转码 iconv和mb_convert_encoding
最近在给公司做一个小工具,将excel表格按照一定的格式转为txt文本格式,要求转后的txt文本是GBK编码,但是总会有几个excel表格无法正常转码,最后查阅相关资料,得到解决方案 先说明下,在ph ...
- IA-32 Assembly Language Reference Manual
Load Full Pointer (lds,les, lfs, lgs, and lss) lds{wl} mem[32|48], reg[16|32]les{wl} mem[32|48], reg ...
- qt json操作
json文件结构形式 { "xiao1": [ { "000100": { " ...
- ORA-00979: 不是 GROUP BY 表达式
在oracle数据库中,sql语句中group by子句报错,原因是select 存在列字段,而group by中不存在.
- Linux设置远程免密登录
1.生成公钥 / 私钥对 [root@localhost ~]# ssh-keygen -t rsa -P '' -P表示密码,-P '' 就表示空密码,也可以不用-P参数,这样就要三车回车,用-P就 ...
- MySQL的简单条件判断语句
在MySQL中条件判断语句常用于数据转换,基于现有数据创建新的数据列,使用场景还是比较多. 基础样式: CASE WHEN`条件`THEN`结果` ELSE`默认结果` END 在同一条判断语句中可以 ...