【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 ...
随机推荐
- 为什么要malloc()?何时要malloc()?如何使用malloc()?
今日写程序,突然想到一个问题,为什么有时候不要malloc,为什么有时候要呢!好好查资料才了解到一些原理. 函数原型:void *malloc(unsigned int num_bytes); //分 ...
- HDU 1114 Piggy-Bank(动态规划、完全背包)
Piggy-Bank Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- jquery html select 清空保留第一项
<select id="a"> <option>1</option> <option>2</option> <op ...
- day 01 常量 注释 int(整型) 用户交互input 流程控制语句if
python的编程语言分类(重点) if 3 > 2: 编译型: 将代码一次性全部编译成二进制,然后再执行. 优点:执行效率高. 缺点:开发效率低,不能跨平台. 代表语言:C 解释型: 逐行解释 ...
- Tarjan算法求有向图强连通分量并缩点
// Tarjan算法求有向图强连通分量并缩点 #include<iostream> #include<cstdio> #include<cstring> #inc ...
- vue-cli3.0本地代理cookie跨域请求Nginx配置
由于后端需要通过请求取前端中的cookie信息,在本地开发模式中,直接请求接口,后端无法拿到前端cookie数据, 经测试需在 vue-cli 中使用代理,如果使用Nginx做反向代理需同时修改Ngi ...
- OpenSSL使用小结
引言 互联网的发展史上,安全性一直是开发者们相当重视的一个主题,为了实现数据传输安全,我们需要保证:数据来源(非伪造请求).数据完整性(没有被人修改过).数据私密性(密文,无法直接读取)等.虽然现在已 ...
- mpvue开发微信小程序之picker
微信使用picker组件,bingchange 换成@change即可使用监听函数和方法 此处注意与微信多了一个mp的信息才能获取到选中的值. 获取当前日期+时间 function formatTim ...
- vue学习【番外篇】vue-cli脚手架的安装
大家好,我是一叶,今天和大家分享的是vue-cli脚手架的安装,关于vue-cli的优点,我就不赘述了. 一.检查安装node 安装vue-cli之前,先检查node是否安装.win+R,输入cmd打 ...
- 使用 dataset 管理数据(官网)
ECharts 4 开始支持了 dataset 组件用于单独的数据集声明,从而数据可以单独管理,被多个组件复用,并且可以基于数据指定数据到视觉的映射.这在不少场景下能带来使用上的方便. ECharts ...