You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWATI/Include/iAlg/iAlgMath/zxGmyBase.h

118 lines
4.6 KiB
C

#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);
// 角度
double degToRad(double _deg);
double radToDeg(double _rad);
double kross(const QPointF& a, const QPointF& b);
double lengthSquared(const QPointF& a);
double pointSegmentDistanceSquared2D(const QPointF& q, const QPointF& p0, const QPointF& p1, double & t);
double pointLineDistanceSquared2D(const QPointF& q, const QPointF& p0, const QPointF& p1, double & 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);
//double distance(double x0, double y0, double x1, double y1);
double distanceSquared(double x0, double y0, double x1, double y1);
double 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(double & _x, double & _y, double t,
double _x0, double _y0, double _x1, double _y1,
double _x2, double _y2, double _x3, double _y3);
bool polygonContainsPoint(const QVector<QPointF> & poly, double x, double y);
bool polygonIsCcw(const QVector<QPointF> & poly);
double polygonArea(const QVector<QPointF> & poly);
void polygonSimplify(QVector<QPointF> & out, const QVector<QPointF> & in, double maxErrDistance2);
int _findIntersection(double u0, double u1, double v0, double v1, double w[2]);
void simplifyPolygonRdp(QVector<QPointF> & out, const QPointF in[], int in_count, int ia, int ib, double maxErrDistance2);
// 计算pt到直线line的垂足。返回值表示垂足是否在线段内部含端点
bool getPadel(const QPointF& pt, const QLineF& line, QPointF& ptPadel);
public:
/// @brief 计算直线距离
static double calDistanceOf(QPointF pt1, QPointF pt2);
/// @brief 计算点P(x,y)与X轴正方向的夹角, 夹角弧度
static double calRadToAxisX(double x, double y);
/// @brief 计算点P(x,y)与X轴正方向的夹角, 夹角°
static double calAngleToAxisX(double x, double y);
/// @brief 点pt围绕点ptCenter旋转弧度fAngleR后的坐标,fAngleR 旋转弧度 or du顺时针为正
static QPointF rotatePt(QPointF pt, QPointF ptCenter, \
double fAngleR, bool bRad = true);
/// @brief 计算两点形成直线的倾斜角0-180
static double calSlopeOf(QPointF pt1, QPointF pt2);
/// @brief 判断两条直线是否平行;
static bool isParallelLines(QLineF line1, QLineF line2);
/// @brief 计算两条直线的距离(如果不平行,返回-1;
static double calDisOfLines(QLineF line1, QLineF line2);
/// @brief 计算两条直线/线段的相交点坐标;
/// bOnlySegment:true 只考虑线段false考虑直线即线段延长线
static bool calCrossOfLines(QPointF& ptCross, \
QLineF line1, QLineF line2, \
bool bOnlySegment = false);
/// @brief 计算点到直线距离
static double calDisOfPt2Line(QPointF pt, QLineF line);
static double calDisOfPt2Line(QPointF pt, \
QPointF pt1, QPointF pt2);
// y = kx + b
static double leastSquareMethodSlop(int cnt,const double x[],const double y[],double &b);
static double leastSquareMethodSlopEx(int cnt,const double x[],const double y[],double &b);
};