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++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#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);
};