CJMMath
示例
要运行示例项目,首先从仓库 clone,然后在 Example 目录中运行 pod install
。
- 与
CJMCGAffineTransform
的相关接口。
/**
* @brief 获取弧度,范围 [0, 2pi]
* @param t transform 仿射矩阵
*/
extern CGFloat CJMGetRadianFromTransform(CGAffineTransform t);
/**
* @brief 获取x方向的缩放比例
* @param t transform 仿射矩阵
*/
extern CGFloat CJMGetScaleXFromTransform(CGAffineTransform t);
/**
* @brief 获取y方向的缩放比例
* @param t transform 仿射矩阵
*/
extern CGFloat CJMGetScaleYFromTransform(CGAffineTransform t);
/**
* @brief 获取x方向的偏移值
* @param t transform 仿射矩阵
*/
extern CGFloat CJMGetTranslateXFromTransform(CGAffineTransform t);
/**
* @brief 获取y方向的偏移值
* @param t transform 仿射矩阵
*/
extern CGFloat CJMGetTranslateYFromTransform(CGAffineTransform t);
/**
* @brief 获取以sourceRect为中心做transform变换后的rect
* @param t transform 仿射矩阵
* @param sourceRect 原始的Rect
*/
extern CGRect CJMGetRectByTransformAndRectCenter(CGAffineTransform t, CGRect sourceRect);
- 对
CJMCGAffineTransform
的相关接口的运算法则说明
CGAffineTransform
包含了缩放、旋转、平移这三个矩阵的叠加,它的生成是通过这三个矩阵按固定顺序相乘得到的。顺序是:1.缩放;2.旋转;3.平移。
缩放
的矩阵表示:
| sx 0 0|
t1 = | 0 sy 0|
| 0 0 1|
旋转
的矩阵表示:
| cos(angle) sin(angle) 0 |
t2 = | -sin(angle) cos(angle) 0 |
| 0 0 1 |
平移
的矩阵表示:
| 1 0 0 |
t3 = | 0 1 0 |
| dx dy 1 |
最终的矩阵表示:
t = t1 * t2 * t3
| sx * cos(angle) sx * sin(angle) 0 |
= | -sy * sin(angle) sy * cos(angle) 0 |
| dx dy 1 |
CGAffineTransform 的矩阵表示为:
| a b 0 |
t = | c d 0 |
| tx ty 1 |
综上所述,可以得到以下公式,该接口的计算按照以下的公式进行运算。
a = sx * cos(angle)
b = sx * sin(angle)
c = -sy * sin(angle)
d = sy * cos(angle)
tx = dx
ty = dy
CJMGeometry
的相关接口,主要是用于计算点、线、角度、交点等几何运算。
// 是否为CGPointZero
extern bool CJMIsPointZero(CGPoint p);
// 是否为CGSizeZero
extern bool CJMIsSizeZero(CGSize s);
// 是否为CGRectZero
extern bool CJMIsRectZero(CGRect r);
//角度转化弧度
extern CGFloat CJMGetRandian(CGFloat angle);
//弧度转化角度
extern CGFloat CJMGetAngle(CGFloat radian);
// 线段与rect的交点
extern CGPoint CJMGetIntersection(CGPoint point0, CGPoint point1, CGRect rect, bool *flag);
// 两个线段的交点
extern CGPoint CJMGetLineIntersection(CGPoint point1, CGPoint point2, CGPoint point3, CGPoint point4, bool *flag);
// 两个点的长度
extern CGFloat CJMGetLength(CGPoint point0, CGPoint point1);
// 弧度,0 ~ 2pi
extern CGFloat CJMGetRadian(CGPoint origin, CGPoint point0, CGPoint point1);
// 弧度,0 ~ 2pi
extern CGFloat CJMGetLineRadian(CGPoint point0, CGPoint point1);
// 沿着startPoint -> endPoint 方向上距离len的点
extern CGPoint CJMGetOutPoint(CGPoint startPoint, CGPoint endPoint, CGFloat len, bool *flag);
// 点point是否在rect上
extern bool CJMIsPointInRect(CGPoint point, CGRect rect);
//一个点在一条直线上的投影坐标
extern CGPoint CJMGetProjectionCoordinateInLine(CGPoint sourcePoint, CGPoint linePoint, CGFloat k);
extern CGPoint CJMGetProjectionCoordinateInLine2(CGPoint sourcePoint, CGPoint linePoint0, CGPoint linePoint1);
//获取直线上的某个点y坐标
extern CGFloat CJMGetPointXWithPointYAndLine(CGFloat pointY, CGPoint linePoint0, CGPoint linePoint1);
//获取直线上的某个点x坐标
extern CGFloat CJMGetPointYWithPointXAndLine(CGFloat pointX, CGPoint linePoint0, CGPoint linePoint1);
要求
安装
CJMMath 通过 CocoaPods 提供。要安装它,只需将以下行添加到 Podfile 中
pod 'CJMMath'
作者
chenjm, [email protected]
许可证
CJMMath可在MIT许可证下使用。有关更多信息,请参阅LICENSE文件。