#pragma once #include "Defines.h" #include "iAlgMath_global.h" class QPointF; class QLineF; // 几何基础类 class I_ALGMATH_EXPORT zxGmyBase { public: zxGmyBase(); virtual ~zxGmyBase(); public: // ccw > 0 double triangle_area(double ax, double ay, double bx, double by, double cx, double cy); // ccw > 0, cw < 0, empty = 0 double triangle_ccw(double ax, double ay, double bx, double by, double cx, double cy); // double triangle_interpolate(double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3,double x, double y); // out < 0, cocircular = 0, in > 0 double in_circle(double ax, double ay, double bx, double by, double cx, double cy, double dx, double dy); // < 0 // a +--- = 0 ----+ b // > 0 double orient2d(double ax, double ay, double bx, double by, double cx, double cy); // | d // | // a --+-- b // | // | c bool is_segment_intersect(double ax, double ay, double bx, double by, double cx, double cy, double dx, double dy); // 角度 float degToRad(float _deg); float radToDeg(float _rad); float kross(const QPointF& a, const QPointF& b); float lengthSquared(const QPointF& a); float pointSegmentDistanceSquared2D(const QPointF& q, const QPointF& p0, const QPointF& p1, float & t); float pointLineDistanceSquared2D(const QPointF& q, const QPointF& p0, const QPointF& p1, float & t); // 距离(有待优化) double dot(double ax, double ay, double bx, double by); double distance_squared(double ax, double ay, double bx, double by); double distance(double ax, double ay, double bx, double by); float distance(float x0, float y0, float x1, float y1); float distanceSquared(float x0, float y0, float x1, float y1); float dot(const QPointF& a, const QPointF& b); int findIntersection(const QPointF& seg0_a, const QPointF& seg0_b, const QPointF& seg1_a, const QPointF& seg1_b, QPointF ip[2]); int findIntersection(const QLineF & seg0, const QLineF & seg1, QPointF ip[2]); void cubic_bezier(float & _x, float & _y, float t, float _x0, float _y0, float _x1, float _y1, float _x2, float _y2, float _x3, float _y3); bool polygonContainsPoint(const QVector & poly, float x, float y); bool polygonIsCcw(const QVector & poly); float polygonArea(const QVector & poly); void polygonSimplify(QVector & out, const QVector & in, float maxErrDistance2); int _findIntersection(float u0, float u1, float v0, float v1, float w[2]); void simplifyPolygonRdp(QVector & out, const QPointF in[], int in_count, int ia, int ib, float maxErrDistance2); // 计算pt到直线line的垂足。返回值表示垂足是否在线段内部(含端点) bool getPadel(const QPointF& pt, const QLineF& line, QPointF& ptPadel); public: /// @brief 计算直线距离 static float calDistanceOf(QPointF pt1, QPointF pt2); /// @brief 计算点P(x,y)与X轴正方向的夹角, 夹角弧度 static float calRadToAxisX(float x, float y); /// @brief 计算点P(x,y)与X轴正方向的夹角, 夹角° static float calAngleToAxisX(float x, float y); /// @brief 点pt围绕点ptCenter旋转弧度fAngleR后的坐标,fAngleR 旋转弧度 or du,顺时针为正 static QPointF rotatePt(QPointF pt, QPointF ptCenter, \ float fAngleR, bool bRad = true); /// @brief 计算两点形成直线的倾斜角(0-180) static float calSlopeOf(QPointF pt1, QPointF pt2); /// @brief 判断两条直线是否平行; static bool isParallelLines(QLineF line1, QLineF line2); /// @brief 计算两条直线的距离(如果不平行,返回-1); static float calDisOfLines(QLineF line1, QLineF line2); /// @brief 计算两条直线/线段的相交点坐标; /// bOnlySegment:true 只考虑线段,false考虑直线,即线段延长线 static bool calCrossOfLines(QPointF& ptCross, \ QLineF line1, QLineF line2, \ bool bOnlySegment = false); /// @brief 计算点到直线距离 static float calDisOfPt2Line(QPointF pt, QLineF line); static float calDisOfPt2Line(QPointF pt, \ QPointF pt1, QPointF pt2); // y = kx + b static double leastSquareMethodSlop(int cnt,const float x[],const float y[],double &b); static double leastSquareMethodSlopEx(int cnt,const float x[],const float y[],double &b); };