三角形的构建方式:
三个非共线的点构造一个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);
}
};