004 — 2D-三角形(Triangle_2 类)

三角形的构建方式:

三个非共线的点构造一个2D三角形。

三角形五心:

重心,外心,内心,垂心,旁心:

重心:三条中线的交点

外心:三条垂直平分线交点

内心:三条内角平分线

垂心:三条高线交点

旁心:与三角形的一边及其他两边的延长线都相切的圆叫作三角形的旁切圆 ,旁切圆的圆心叫三角形的旁心。

重心、外心、内心、垂心只有一个,但旁心有三个。

Triangle_2.h

#pragma once
#include <opencv2/opencv.hpp>
#include "Line_2.h"

class Triangle_2
{
public:
	Point_2 _p1;
	Point_2 _p2;
	Point_2 _p3;

public:
	Triangle_2()
	{
		_p1.x = _p2.x = _p3.x = 0.0;
		_p1.y = _p2.y = _p3.y = 0.0;
	}

	Triangle_2(const Point_2& a, const Point_2& b, const Point_2& c)
	{
		Line_2 line1(a, b);
		Line_2 line2(a, c);
		if (line1.GetDirVec() == line2.GetDirVec()||line1.GetDirVec() == -line2.GetDirVec())
		{
			std::cout << "三点共线,无法构造有效三角形" << std::endl;
		}
		_p1 = a;
		_p2 = b;
		_p3 = c;
	}

	// 计算三角形三个边长,并按从小到大排列
	inline std::array<float, 3> GetEdgesLength() const
	{
		std::array<float, 3> len_s = { 0.0 };
		len_s[0] = disPP_2(_p1, _p2);
		len_s[1] = disPP_2(_p2, _p3);
		len_s[2] = disPP_2(_p3, _p1);
		std::sort(len_s.begin(), len_s.end()); // sort的默认排序是从小到大
		return len_s;
	}

	// 计算三角形三个内角,并按从小到大顺序排列
	inline std::array<float, 3> GetInsideAngles() const
	{
		std::array<float, 3> ang_s = { 0.0 };
		float a = disPP_2(_p2, _p3);
		float b = disPP_2(_p1, _p3);
		float c = disPP_2(_p1, _p2);

		ang_s[0] = acos((b * b + c * c - a * a) / (2 * b * c));
		ang_s[1] = acos((a * a + c * c - b * b) / (2 * a * c));
		ang_s[2] = acos((a * a + b * b - c * c) / (2 * a * b));
		std::sort(ang_s.begin(), ang_s.end());
		return ang_s;
	}

	// 三角形面积
	inline float Area() const
	{
		float a = disPP_2(_p2, _p3);
		float b = disPP_2(_p1, _p3);
		float c = disPP_2(_p1, _p2);

		float m = (a + b + c) / 2.0;
		return sqrt(m * (m - a) * (m - b) * (m - c));
	}

	// 三角形重心
	Point_2 GravityCenter() const
	{
		return Point_2((_p1.x + _p2.x + _p3.x) / 3.0, (_p1.y + _p2.y + _p3.y) / 3.0);
	}

	// 三角形垂心
	Point_2 Orthocenter() const
	{
		float a1, b1, a2, b2, c1, c2;
		a1 = _p2.x - _p1.x, b1 = _p2.y - _p1.y, c1 = 0;
		a2 = _p2.x - _p3.x, b2 = _p2.y - _p3.y, c2 = (_p1.x - _p3.x) * a2 + (_p1.y - _p3.y) * b2;
		double d = a1 * b2 - a2 * b1;
		return Point_2(_p3.x + (c1 * b2 - c2 * b1) / d, _p3.y + (a1 * c2 - a2 * c1) / d);
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值