参考资料:

题目: 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. 为什么要malloc()?何时要malloc()?如何使用malloc()?

    今日写程序,突然想到一个问题,为什么有时候不要malloc,为什么有时候要呢!好好查资料才了解到一些原理. 函数原型:void *malloc(unsigned int num_bytes); //分 ...

  2. HDU 1114 Piggy-Bank(动态规划、完全背包)

    Piggy-Bank Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  3. jquery html select 清空保留第一项

    <select id="a"> <option>1</option> <option>2</option> <op ...

  4. day 01 常量 注释 int(整型) 用户交互input 流程控制语句if

    python的编程语言分类(重点) if 3 > 2: 编译型: 将代码一次性全部编译成二进制,然后再执行. 优点:执行效率高. 缺点:开发效率低,不能跨平台. 代表语言:C 解释型: 逐行解释 ...

  5. Tarjan算法求有向图强连通分量并缩点

    // Tarjan算法求有向图强连通分量并缩点 #include<iostream> #include<cstdio> #include<cstring> #inc ...

  6. vue-cli3.0本地代理cookie跨域请求Nginx配置

    由于后端需要通过请求取前端中的cookie信息,在本地开发模式中,直接请求接口,后端无法拿到前端cookie数据, 经测试需在 vue-cli 中使用代理,如果使用Nginx做反向代理需同时修改Ngi ...

  7. OpenSSL使用小结

    引言 互联网的发展史上,安全性一直是开发者们相当重视的一个主题,为了实现数据传输安全,我们需要保证:数据来源(非伪造请求).数据完整性(没有被人修改过).数据私密性(密文,无法直接读取)等.虽然现在已 ...

  8. mpvue开发微信小程序之picker

    微信使用picker组件,bingchange 换成@change即可使用监听函数和方法 此处注意与微信多了一个mp的信息才能获取到选中的值. 获取当前日期+时间 function formatTim ...

  9. vue学习【番外篇】vue-cli脚手架的安装

    大家好,我是一叶,今天和大家分享的是vue-cli脚手架的安装,关于vue-cli的优点,我就不赘述了. 一.检查安装node 安装vue-cli之前,先检查node是否安装.win+R,输入cmd打 ...

  10. 使用 dataset 管理数据(官网)

    ECharts 4 开始支持了 dataset 组件用于单独的数据集声明,从而数据可以单独管理,被多个组件复用,并且可以基于数据指定数据到视觉的映射.这在不少场景下能带来使用上的方便. ECharts ...