参考资料:

题目: 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个点是否落在三角形内的更多相关文章

  1. 前端与算法 leetcode 387. 字符串中的第一个唯一字符

    目录 # 前端与算法 leetcode 387. 字符串中的第一个唯一字符 题目描述 概要 提示 解析 解法一:双循环 解法二:Set法单循环 算法 传入测试用例的运行结果 执行结果 GitHub仓库 ...

  2. LeetCode.993-二叉树中的堂兄弟(Cousins in Binary Tree)

    这是悦乐书的第374次更新,第401篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第235题(顺位题号是993).在二叉树中,根节点在深度0处,并且每个深度为k的节点的子 ...

  3. jQuery判断网页中的id是否有重复的

    From:http://blog.csdn.net/china_skag/article/details/6915323判断网页中的ID是否有重复的:指定ID判断 $(function(){ $(&q ...

  4. 如何判断js中的数据类型?

    js六大数据类型:number.string.object.Boolean.null.undefined string: 由单引号或双引号来说明,如"string" number: ...

  5. 如何判断js中的数据类型

    如何判断js中的数据类型:typeof.instanceof. constructor. prototype方法比较 如何判断js中的类型呢,先举几个例子: var a = "iamstri ...

  6. Jquery判断数组中是否包含某个元素$.inArray()的用法

    判断数组里面是否包含某个元素可以使用 $.inArray("元素(字符串)",数组名称) 进行判断 ,当存在该元素(字符串)时,返回该元素在数组的下标,不存在时返回 -1 示例代码 ...

  7. Ifvisible.js – 判断网页中的用户是闲置还是活动状态

    ifvisible.js 是一个跨浏览器.轻量级的方式,用户检查用户在浏览页面或正在与它进行交互.它可以处理活动状态,如在页面上空闲或活跃.您还可以使用 ifvisible.js 智能设置您的间隔,如 ...

  8. PHP判断字符串中是否包含指定字符串,支持中文哦

    RT,随手写的 /** * 判断字符串中是否包含指定字符串 * @var source 源字符串 * @var target 要判断的是否包含的字符串 * @return bool */ functi ...

  9. [转]如何判断js中的数据类型

    原文地址:http://blog.sina.com.cn/s/blog_51048da70101grz6.html 如何判断js中的数据类型:typeof.instanceof. constructo ...

随机推荐

  1. python 并发编程 协程 greenlet模块

    一 greenlet模块 不敢是yield,还是greenlet都没有实现检测io,实现遇到io切换效果 如果我们在单个线程内有20个任务,要想实现在多个任务之间切换,使用yield生成器的方式过于麻 ...

  2. 第六周作业&实验报告四

    一.实验目的 (1)掌握类的继承 (2)变量的继承和覆盖,方法的继承,重载和覆盖的实现: 二.实验的内容 (1)根据下面的要求实现圆类Circle. 1.圆类Circle的成员变量:radius表示圆 ...

  3. python之入门

    第一章 入门 1.1 变量-输出 a = 1 # 声明变量 a # 变量的名字 = # 赋值 1 # 值 变量定义的规则: 1.变量由数字,字母,下划线组成 2.不能以数字开头 3.不能使用pytho ...

  4. 解决Asp.net Core中chtml文档中文乱码的问题

    原因 由于Visual Studio 2017在保存chtml时,文本格式非utf-8,所以导致中文会出现乱码情况. 解决办法 在工具->扩展与更新中添加插件"ForceUTF8 (w ...

  5. php转码 iconv和mb_convert_encoding

    最近在给公司做一个小工具,将excel表格按照一定的格式转为txt文本格式,要求转后的txt文本是GBK编码,但是总会有几个excel表格无法正常转码,最后查阅相关资料,得到解决方案 先说明下,在ph ...

  6. 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 ...

  7. qt json操作

    json文件结构形式 {    "xiao1": [        {            "000100": {                " ...

  8. ORA-00979: 不是 GROUP BY 表达式

    在oracle数据库中,sql语句中group by子句报错,原因是select 存在列字段,而group by中不存在.

  9. Linux设置远程免密登录

    1.生成公钥 / 私钥对 [root@localhost ~]# ssh-keygen -t rsa -P '' -P表示密码,-P '' 就表示空密码,也可以不用-P参数,这样就要三车回车,用-P就 ...

  10. MySQL的简单条件判断语句

    在MySQL中条件判断语句常用于数据转换,基于现有数据创建新的数据列,使用场景还是比较多. 基础样式: CASE WHEN`条件`THEN`结果` ELSE`默认结果` END 在同一条判断语句中可以 ...