【华为练习题】判断点是否在三角形中

【华为练习题】判断点是否在三角形中

题目

一个二维坐标系中(100*100,每一维0~99),已知三角形三个顶点的坐标A、B、C,判断坐标系中的任意点:P,是否在三角形内(在三角形边上也认为在三角形内)

请实现如下接口

/* 功能:点是否在三角形内

  • 输入:三角形三顶点坐标:A、B、C,以及待确认的点:P
  • 输出:无
  • 返回:在三角形内返回true,否则返回false

    */

public static boolean isInTriangle(POINTA, POINTB, POINTC, POINTP)

{

 return true;

}

约束:

二维坐标系中(100*100,每一维0~99),接口传入4点坐标的合法性由调用者保证

分析

三角形PAB,PBC,PAC的面积之和等于ABC的面积,则可判断P在ABC中。

解答

#include <iostream>
using namespace std;

class Point{
public:
    Point(double fx, double fy):x(fx),y(fy) {};
    double x;
    double y;
};

inline double dis(const Point &p1, const Point &p2){
    return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}

double area(const Point &a, const Point &b, const Point &c){
    double ab = dis(a,b), ac = dis(a,c), bc = dis(b,c);
    double p = 0.5 * (ab + ac + bc);
    return sqrt(p * (p - ab) * (p - ac) * (p - bc));
}

inline bool doubleEqual(double d1, double d2){
    return abs(d1 - d2) < 0.000001;
}

bool isInTriangle(const Point &a, const Point &b, const Point &c, const Point &p){
    return doubleEqual(area(a,b,c), area(p,a,b) + area(p,a,c) + area(p,b,c));
}
时间: 2024-10-21 23:11:01

【华为练习题】判断点是否在三角形中的相关文章

华为练习题--社交好友判断

好友关系管理 描述: 现有一个社交网站,其好友推荐策略为:用户A和用户B不是好友,当二人的共同好友数量超过好友推荐阈值m时,就向A和B分别推荐为彼此好友. 本题任务为:对设定的m值,给定一组用户及各自好友列表,对这一组用户,反复自动应用上述好友推荐策略后(假设每次推荐都被采纳),求指定用户的最终好友列表. 注:好友关系是双向的,即:如果用户A是用户B的好友,那么用户B一定也是用户A的好友. 写一个程序,在社交网络中实现: 1)初始化社交网络 2)创建用户 3)增加指定两个用户之间的好友关系 4)

华为oj 之 判断点是否在三角形内

/* * 任意顶点为A.B.C的三角形,如果点P在三角形内,那么 * 1)点P和点C在AB边的同一侧 2)点P和点A在BC边的同一侧 3)点P和点B在AC边的同一侧 * 反之亦然(充要条件) * * 关键:如何判断某两个点在某条直线的同一侧 * 参考图示发现: *   对于点P: AB*BC的方向 和 AB*BP的方向相同 *    对于点P1: AB*BC的方向 和 AB*BP1的方向不同 * 故:对于边AB,以及点C.P,如果AB*BC的方向 和 AB*BP的方向相同, *    那么点P和

【华为练习题】 求最大凸多边形(高级)

[华为练习题] 求最大凸多边形(高级) 题目 题目描述: 给定一些点,输出最大面积的凸边形.输出起始点为x轴最左边的点,按照顺时针方向输出,每个点必须是凸边形的顶点(不输出边上或凸边形内的点).输入第一个数n为坐标点个数,后面依次为n个坐标点的坐标,横坐标在前,不同坐标点用':'隔开,相同坐标点的横纵坐标用','隔开. 输入样例: 13;-4,1;-2,3;1,3;2,2;1,4;5,4;6,1;2,-4;-3,-3;1,-1;-2,-2;1,-2;-1,-1 输出样例: -4,1;-2,3;1

【华为练习题】字符出现频率

[华为练习题]字符出现频率 题目 描述:写出一个程序,输出基准字符串中统计指定字符出现的频率 字符串仅包括英文大小写字母和空格.逗号.点号 小数点后保留2位有效数字,第三位四舍五入 举例: 输入:wo shi, yi zhi.xiao xiao niao ' '(空格) 输出:0.17 接口说明: /* 功能: 输入的基准字符串中统计指定字符出现的频率 字符串仅包括英文大小写字母和空格.逗号.点号 小数点后保留2位有效数字,第三位四舍五入 输入: String pString 输入的基准字符串

【华为练习题】用两个栈来模拟队列(中级)

[华为练习题]用两个栈来模拟队列(中级) 题目 栈的特点是后进先出,队列的特点是先进先出.所以,用两个栈S1和S2模拟一个队列时, 要求两个栈S1和S2的长度都是5. 要求实现以下函数: enQueue 将元素value插入队列,若入队列成功返回true,否则返回false deQueue 从队列中取出一个元素放入value,若出队列成功返回true,否则返回false. isEmptyQueue 判用队列是否为空,如果是空则返回true,如果不是空则返回false. 分析 S1作输入栈,逐个元

【华为练习题 】 长寿的兔子

[华为练习题 ] 长寿的兔子 题目 从前有一对长寿的兔子,他们每个月生出一对小兔子,第一个月新生产的兔子两个月就长大了,在第三个月初开始生他们的下一代小兔子,这样一代一代的生下去,不考虑兔子的寿命,求第n个月出生多少对小兔子 简单示例: 比如输入1,第一个月出生的兔子只有一对,所以输出为1 比如输入2,第二个月出生的兔子只有一对,所以输出为1 比如输出为3,则该月份有两对兔子出生,则输出为2 要求: 实现以下接口: 输入一个正整数,表示第几个月,输出该月份生产出的小兔子的对数 调用者会保证: 输

二维平面上判断点是否在三角形内

最近在项目中碰到的这个问题,在此记录一下.已知三角形的三个顶点坐标,判断某个点是否在三角形中(在三角形的边上,我们也视作在三角形中),本文给出了三种方法.   算法1 利用面积法,如上图所示,如果点P在三角形ABC的内部,则三个小三角形PAB, PBC, PAC的面积之和 = ABC的面积,反之则不相等. 已知三角形的三个顶点坐标求其面积,可以根据向量的叉乘,参考here. 该算法详见后面的函数:IsPointInTriangle1   算法2 首先看一下这个问题,如何判断某两个点在某条直线的同

【华为练习题】 最后一个单词的长度(初级)

[华为练习题] 最后一个单词的长度(初级) 题目 描述: 计算字符串最后一个单词的长度,单词以空格隔开. 题目类别: 字符串 输入: 一行字符串,长度小于128. 输出: 整数N,最后一个单词的长度. 样例输入: hello world 样例输出: 5 解答 #include <iostream> #include <string> using namespace std; int last_word_length(const string &s){ auto begin

华为OJ——判断两个IP是否属于同一子网

题目描述 子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据. 子网掩码与IP地址结构相同,是32位二进制数,其中网络号部分全为"1"和主机号部分全为"0".利用子网掩码可以判断两台主机是否中同一子网中.若两台主机的IP地址分别与它们的子网掩码相"与"后的结果相同,则说明这两台主机在同一子网中. 示例: I P 地址  192.168.0.1 子网掩码  255.255.255.0 转化为二进制进行运算: I P 地址 11010