You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

328 lines
7.3 KiB

//
// SWPosPointcut.h
// DrawTest
//
// Created by 王阳阳 on 2022/9/6.
//
#ifndef SWPosPointcut_h
#define SWPosPointcut_h
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <QList>
enum SWPosStatus {
SWPosRetFail = 0,
SWPosRetSuccess = 1,
};
typedef enum SWPosStatus SWPosStatus;
struct SWPointcut {
double x;
double y;
};
typedef struct SWPointcut SWPointcut;
struct SWPosPoint {
SWPointcut realPoint;
double radius;
};
typedef struct SWPosPoint SWPosPoint;
struct SWLineSegment {
SWPointcut startPoint;
SWPointcut endPoint;
SWPosStatus status;
void *preSegment;
SWLineSegment()
{
preSegment = nullptr;
}
};
typedef struct SWLineSegment SWLineSegment;
/**
*
* @brief The SWCirclePoint struct
*/
struct SWCirclePoint {
SWPointcut pointA;
SWPointcut pointB;
SWPointcut pointC;
SWPointcut pointD;
SWPointcut pointE;
SWPointcut pointF;
SWPointcut pointG;
SWPointcut pointH;
SWPointcut pointI;
SWPointcut pointJ;
SWPointcut pointK;
SWPointcut pointL;
SWPointcut pointM;
};
typedef struct SWCirclePoint SWCirclePoint;
struct SWPosRet {
SWPointcut prevLeftPoint;//左侧切点
SWPointcut prevLeftIntersectPoint;//左侧切点交点
SWPointcut prevRightPoint;//右侧切点
SWPointcut prevRightIntersectPoint;//右侧切点交点
SWPointcut curLeftPoint;//当前点左侧切点
SWPointcut curRightPoint;//当前点右侧切点
QList<SWCirclePoint> circlePoints;//补点数据
int circleCount;//补点数量
SWPosStatus status;//计算结果状态
};
typedef struct SWPosRet SWPosRet;
/**
*
* @brief SWPosRest
* @param pos
*/
void SWPosRest(SWPosPoint pos);
/**
*
* @brief SWGetTangentcurPoint
* @param prevPoint
* @param curPoint
* @param leftLine 线
* @param rightLine 线
* @param circle 1 true 0 false
* @return
*/
SWPosRet SWGetTangentcurPoint(SWPosPoint prevPoint,SWPosPoint curPoint,SWLineSegment leftLine,SWLineSegment rightLine,int circle);
/**
*
* @brief GetPointDistance
* @param start
* @param end
* @return
*/
double GetPointDistance(SWPosPoint start, SWPosPoint end);
/**
* 线
* @brief SWratioPoint
* @param startPoint 线
* @param endPoint 线
* @param ratio 线
* @return
*/
SWPointcut SWratioPoint(SWPointcut startPoint, SWPointcut endPoint, double ratio);
/**
*
* @brief SWrotatePoint
* @param point
* @param center
* @param angle ()
* @return
*/
SWPointcut SWrotatePoint(SWPointcut point, SWPointcut center, double angle);
/**
* 线(线)
* @brief SWgetEdgePoint
* @param a 线
* @param b 线
* @param c 线
* @param d 线
* @param e
* @param directionLine 线(1线0线)
* @return
*/
SWPointcut SWgetEdgePoint(SWPointcut a, SWPointcut b, SWPointcut c,
SWPointcut d,SWPointcut e,int directionLine);
/**
* 线
* @brief SWLineMakeZero
* @return
*/
SWLineSegment SWLineMakeZero(void);
/**
*
* @brief SWPosPointMakeZero
* @return
*/
SWPosPoint SWPosPointMakeZero(void);
/**
* 线
* @brief SWLineMake
* @param x1
* @param y1
* @param x2
* @param y2
* @return
*/
SWLineSegment SWLineMake(double x1,double y1,double x2, double y2);
/**
*
* @brief SWPointCutMake
* @param x
* @param y
* @return
*/
SWPointcut SWPointCutMake(double x,double y);
/**
*
* @brief SWPosPointMake
* @param x
* @param y
* @param radius
* @return
*/
SWPosPoint SWPosPointMake(double x,double y,double radius);
/**
* 线线
* @brief SWExtendPoint
* @param a 线
* @param b 线
* @param c 线
* @param d 线
* @return
*/
SWPointcut SWExtendPoint(SWPointcut a, SWPointcut b, SWPointcut c,SWPointcut d);
/**
* 线(线)
* @brief SWBetweenLinesrads
* @param line1Start 线
* @param line1End 线
* @param line2Start 线
* @param line2End 线
* @return
*/\
double SWBetweenLinesrads(SWPointcut line1Start, SWPointcut line1End,
SWPointcut line2Start, SWPointcut line2End);
/**
*
* @brief CalculatePointradius
* @param speed
* @param prevPointradius
* @param radius
* @param force
* @param maxForce
* @param stressSpl
* @param forceEnable 10
* @param distance
* @return
*/
double CalculatePointradius(double speed,double prevPointradius,double radius,
double force ,double maxForce,double stressSpl,
int forceEnable,double distance);
/**
*
* @brief CalculateStroke
* @param posAry 线
* @param length
* @param preRadius
* @return
*/
SWPosPoint * CalculateStroke(SWPosPoint posAry[],int length,double preRadius);
/**
*
* @brief CalculateShake
* @param prePoint
* @param curPoint
* @param nextPoint
* @return
*/
SWPosStatus CalculateShake(SWPosPoint prePoint,SWPosPoint curPoint,SWPosPoint nextPoint);
/**
*
* @brief SWPosEqualToPos
* @param pos1
* @param pos2
* @return
*/
SWPosStatus SWPosEqualToPos(SWPosPoint pos1,SWPosPoint pos2);
SWPointcut GetMaleTangentPointValue(SWPosPoint point, double a);
/**
*/
SWPosStatus IsPointInMatrix(SWPointcut p1 ,SWPointcut p2,SWPointcut p3 ,SWPointcut p4,SWPointcut p);
double GetCross(SWPointcut p1, SWPointcut p2,SWPointcut p);
SWPointcut ExPandLine(SWPointcut pt1,SWPointcut pt2,double nLen);
/**
线
*/
SWCirclePoint SWCircleMake(SWPosPoint center);
double getAngle(double x1, double y1, double x2, double y2);
SWPointcut getSamllAngleVertex(SWPointcut b, SWPointcut c,double cosAngle);
SWPointcut calcNewPoint(SWPointcut p, SWPointcut pCenter, double theta);
/**
* 线
* @brief getCircleSegments
* @param prevPoint
* @param curPoint
* @param leftLine
* @param rightLine
* @param distance
* @param step
* @return
*/
SWPosRet getCircleSegments(SWPosPoint prevPoint,SWPosPoint curPoint,
SWLineSegment leftLine,SWLineSegment rightLine,
double distance,int step);
int isPointOnLine(double x, double y, SWPointcut start, SWPointcut end);
/**
*
* @brief fillPoints
* @param prevPoint
* @param curPoint
* @param distance
* @return
*/
QList<SWPosPoint> fillPoints(SWPosPoint prevPoint,SWPosPoint curPoint,double distance);
#endif /* SWPosPointcut_h */