计算一/二元一次方程的类(用于动画控制)

简介:

计算一/二元一次方程的类(用于动画控制)

源码:

//
//  YXMath.h
//
//  http://home.cnblogs.com/u/YouXianMing/
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface YXMath : NSObject

/*---- 计算一元一次方程 ----

    y = kX + b
 
 ------------------------*/
@property (nonatomic, assign, readonly) CGFloat  k;
@property (nonatomic, assign, readonly) CGFloat  b;
- (instancetype)initWithLinearFunctionPointA:(CGPoint)pointA
                                      pointB:(CGPoint)pointB;


/*---- 计算一元二次方程普通式 ----

 y = aX^2 + bX + c
 
 ----------------------------*/
@property (nonatomic, assign, readonly) CGFloat  A;
@property (nonatomic, assign, readonly) CGFloat  B;
@property (nonatomic, assign, readonly) CGFloat  C;
- (instancetype)initWithQuadraticFunctionPointA:(CGPoint)pointA
                                         pointB:(CGPoint)pointB
                                         pointC:(CGPoint)pointC;

/*---- 计算一元二次方程顶点式 ----
 
 y = a(X - h)^2 + k
 注意:顶点为(h, k)
 
 ----------------------------*/
@property (nonatomic, assign, readonly) CGFloat  a;
- (instancetype)initWithQuadraticFunctionPointApex:(CGPoint)apex
                                             point:(CGPoint)point;


@end


//
//  YXMath.m
//
//  http://home.cnblogs.com/u/YouXianMing/
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "YXMath.h"

@implementation YXMath

- (instancetype)initWithQuadraticFunctionPointA:(CGPoint)pointA
                                         pointB:(CGPoint)pointB
                                         pointC:(CGPoint)pointC
{
    self = [super init];
    if (self)
    {
        CGFloat x1 = pointA.x; CGFloat y1 = pointA.y;
        CGFloat x2 = pointB.x; CGFloat y2 = pointB.y;
        CGFloat x3 = pointC.x; CGFloat y3 = pointC.y;
        
        _A = calculateA(x1, y1, x2, y2, x3, y3);
        _B = calculateB(x1, y1, x2, y2, x3, y3);
        _C = calculateC(x1, y1, x2, y2, x3, y3);
    }
    return self;
}

- (instancetype)initWithLinearFunctionPointA:(CGPoint)pointA
                                        pointB:(CGPoint)pointB
{
    self = [super init];
    if (self)
    {
        CGFloat x1 = pointA.x; CGFloat y1 = pointA.y;
        CGFloat x2 = pointB.x; CGFloat y2 = pointB.y;
        
        _k = calculateSlope(x1, y1, x2, y2);
        _b = calculateConstant(x1, y1, x2, y2);
    }
    return self;
}

- (instancetype)initWithQuadraticFunctionPointApex:(CGPoint)apex
                                             point:(CGPoint)point
{
    self = [super init];
    if (self)
    {
        CGFloat h  = apex.x; CGFloat   k = apex.y;
        CGFloat x  = point.x; CGFloat  y = point.y;
        
        _a = (y - k)/((x - h)*(x - h));
    }
    return self;
}

#pragma mark - 计算常数a b c
CGFloat calculateA(CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2, CGFloat x3, CGFloat y3)
{
    return ((y2 - y1)/(x2 - x1) - (y3 - y2)/(x3 - x2))/(x1 - x3);
}

CGFloat calculateB(CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2, CGFloat x3, CGFloat y3)
{
    return (y2 - y1)/(x2 - x1) - (((y2 - y1)/(x2 - x1) - (y3 - y2)/(x3 - x2))/(x1 - x3));
}

CGFloat calculateC(CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2, CGFloat x3, CGFloat y3)
{
    CGFloat a = calculateA(x1, y1, x2, y2, x3, y3);
    CGFloat b = calculateB(x1, y1, x2, y2, x3, y3);
    return y1 - a*x1*x1 - b*x1;
}

#pragma mark - 计算斜率 k
CGFloat calculateSlope(CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2)
{
    return (y2 - y1) / (x2 - x1);
}

#pragma mark - 计算常数 b
CGFloat calculateConstant(CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2)
{
    return (y1*(x2 - x1) - x1*(y2 - y1)) / (x2 - x1);
}


@end

目录
相关文章
|
移动开发 文字识别 算法
论文推荐|[PR 2019]SegLink++:基于实例感知与组件组合的任意形状密集场景文本检测方法
本文简要介绍Pattern Recognition 2019论文“SegLink++: Detecting Dense and Arbitrary-shaped Scene Text by Instance-aware Component Grouping”的主要工作。该论文提出一种对文字实例敏感的自下而上的文字检测方法,解决了自然场景中密集文本和不规则文本的检测问题。
1883 0
论文推荐|[PR 2019]SegLink++:基于实例感知与组件组合的任意形状密集场景文本检测方法
|
5天前
|
JavaScript
函数形状的定义方式
函数形状的定义方式
|
5天前
|
Python
Python函数之计算规则图形的面积
Python函数之计算规则图形的面积
16 0
|
5天前
|
算法
【MFAC】基于紧格式动态线性化的无模型自适应迭代学习控制
【MFAC】基于紧格式动态线性化的无模型自适应迭代学习控制
【MFAC】基于紧格式动态线性化的无模型自适应迭代学习控制
|
8月前
堆叠体体积求值的范围问题:已知堆叠体三视图,求该堆叠体体积的最大值和最小值
堆叠体体积求值的范围问题:已知堆叠体三视图,求该堆叠体体积的最大值和最小值
41 0
设计一个长方形类,成员变量包括长度和宽度,成员函数除包括计算周长和计算面积外,还包括用 Set 方法设置长和宽,以及用 get 方法来获取长
设计一个长方形类,成员变量包括长度和宽度,成员函数除包括计算周长和计算面积外,还包括用 Set 方法设置长和宽,以及用 get 方法来获取长
153 0
|
PyTorch 算法框架/工具
已经定义好了一个张量,如何增加代码要求计算梯度?
在 PyTorch 中,可以使用 requires_grad_() 方法来动态设置张量的 requires_grad 属性为 True,从而要求计算梯度。具体来说,对于已经创建的张量 x,可以通过调用 x.requires_grad_() 来将其设置为需要计算梯度的张量。
250 0
|
机器学习/深度学习
将迭代次数问题几何化的一个计算例子
神经网络调参,设置迭代次数
88 0
将迭代次数问题几何化的一个计算例子
|
uml
(设计题)造一个凳子(stool)是由三个圆柱体组成,分别表示它的 顶部,中部和底部。计算凳子的体积和表面积(忽略重叠的部分)。 请设计UML图(包括类以及类的关系,可以省略方法和属性),并完成代码。
(设计题)造一个凳子(stool)是由三个圆柱体组成,分别表示它的 顶部,中部和底部。计算凳子的体积和表面积(忽略重叠的部分)。 请设计UML图(包括类以及类的关系,可以省略方法和属性),并完成代码。
124 0
(设计题)造一个凳子(stool)是由三个圆柱体组成,分别表示它的 顶部,中部和底部。计算凳子的体积和表面积(忽略重叠的部分)。 请设计UML图(包括类以及类的关系,可以省略方法和属性),并完成代码。
|
机器学习/深度学习 算法
巧借循环对神经网络输出值控制得理想值【MATLAB】
巧借循环对神经网络输出值控制得理想值【MATLAB】
111 0