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

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.

//
// 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 是否开启1开启0关闭
* @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 */