开发过程中用不到一元一次方程吗?非也,iOS开发中经常会遇到根据某个ScrollView动态偏移量的值来实时设置一个View的透明度,你敢说你不用一元一次方程你能搞定?

想把一个动画效果做好,经常会遇到实时设置的问题,本人遇到过多次,总结出经验,提供方法来专门计算一元一次方程的K值以及b值,方便开发.

BinaryLinearEquation.h + BinaryLinearEquation.m  提供内联函数以及类方法

//  Copyright (c) 2014年 Y.X. All rights reserved.
// #import <Foundation/Foundation.h> NS_INLINE CGFloat calculateSlope(CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2)
{
return (y2 - y1) / (x2 - x1);
} NS_INLINE CGFloat calculateConstant(CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2)
{
return (y1*(x2 - x1) - x1*(y2 - y1)) / (x2 - x1);
} @interface BinaryLinearEquation : NSObject /**
* 计算一元一次方程的斜率 K
*
* Y = kX + b,输入两个点坐标的值(x1, y1), (x2, y2)来计算斜率k的值
*
* @param 坐标值 两个点的坐标值(x1, y1), (x2, y2)
* @return 计算得出的斜率值
*/
+ (CGFloat)calculateSlopeWithX1:(CGFloat)x1 Y1:(CGFloat)y1 X2:(CGFloat)x2 Y2:(CGFloat)y2; /**
* 计算一元一次方程的常数 b
*
* Y = kX + b,输入两个点坐标的值(x1, y1), (x2, y2)来计算常数b的值
*
* @param 坐标值 两个点的坐标值(x1, y1), (x2, y2)
* @return 计算得出的常数值
*/
+ (CGFloat)calculateConstantWithX1:(CGFloat)x1 Y1:(CGFloat)y1 X2:(CGFloat)x2 Y2:(CGFloat)y2; @end
//  Copyright (c) 2014年 Y.X. All rights reserved.
// #import "BinaryLinearEquation.h" @implementation BinaryLinearEquation + (CGFloat)calculateSlopeWithX1:(CGFloat)x1 Y1:(CGFloat)y1 X2:(CGFloat)x2 Y2:(CGFloat)y2
{
return (y2 - y1) / (x2 - x1);
} + (CGFloat)calculateConstantWithX1:(CGFloat)x1 Y1:(CGFloat)y1 X2:(CGFloat)x2 Y2:(CGFloat)y2
{
return (y1*(x2 - x1) - x1*(y2 - y1)) / (x2 - x1);
} @end

测试:

y = 7x - 9

k = 7

b = -9

两个点(0, -9),(9/7, 0)

---------------------------------------------------------------------------------------------

NSLog(@"%f", calculateSlope(0.f, -9.f, 9.f/7.f, 0.f));
    NSLog(@"%f", calculateConstant(0.f, -9.f, 9.f/7.f, 0.f));
    
    NSLog(@"%f", [BinaryLinearEquation calculateSlopeWithX1:0.f     Y1:-9.f
                                                         X2:9.f/7.f Y2:0.f]);
    NSLog(@"%f", [BinaryLinearEquation calculateConstantWithX1:0.f     Y1:-9.f
                                                            X2:9.f/7.f Y2:0.f]);

---------------------------------------------------------------------------------------------

2014-03-28 09:46:00.898 woobooWall[1440:60b] 7.000000
2014-03-28 09:46:00.899 woobooWall[1440:60b] -9.000000
2014-03-28 09:46:00.899 woobooWall[1440:60b] 7.000000
2014-03-28 09:46:00.899 woobooWall[1440:60b] -9.000000

使用时请将数据转换为CGFloat型.

附录1:

附录2:

根据一元一次方程组计算所有的红绿蓝透明度的斜率以及常数值

CalculateColor.h + CalculateColor.m

//
// CalculateColor.h
// Animation
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import <Foundation/Foundation.h> typedef struct ColorParam { CGFloat redSlope; // 红色的斜率 k
CGFloat redConstant; // 红色的常数 b CGFloat greenSlope; // 绿色的斜率 k
CGFloat greenConstant; // 绿色的常数 b CGFloat blueSlope; // 蓝色的斜率 k
CGFloat blueConstant; // 蓝色的常数 b CGFloat alphaSlope; // 透明度的斜率 k
CGFloat alphaConstant; // 透明度的常数 b } SColorParam; /**
根据一元一次方程组计算所有的红绿蓝透明度的斜率以及常数值 这是用来设计做动态设定动画效果的,需要提供起始点的UIColor,起始点的一个值,终点的UIColor,终点的一个值,然后计算
出动画过程中需要的一些设置参数. @param oldColor 起始点的color
@param oldPoint 起始点的值
@param newColor 终点的color
@param newPoint 终点的值
@param param 计算好的值存储于结构体SColorParam中 @return none
*/
void calculateUIColorAndPoint(UIColor *oldColor,CGFloat oldPoint,
UIColor *newColor, CGFloat newPoint,
SColorParam *param);
//
// CalculateColor.m
// Animation
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import "CalculateColor.h" #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);
} #pragma mark - 根据一元一次方程组计算所有的红绿蓝透明度的斜率以及常数值
void calculateUIColorAndPoint(UIColor *oldColor,CGFloat oldPoint,
UIColor *newColor, CGFloat newPoint,
SColorParam *param)
{
// 获取旧颜色
CGFloat oldRed = ;
CGFloat oldGreen = ;
CGFloat oldBlue = ;
CGFloat oldAlpha = ;
[oldColor getRed:&oldRed green:&oldGreen blue:&oldBlue alpha:&oldAlpha]; // 获取新颜色
CGFloat newRed = ;
CGFloat newGreen = ;
CGFloat newBlue = ;
CGFloat newAlpha = ;
[newColor getRed:&newRed green:&newGreen blue:&newBlue alpha:&newAlpha]; // 计算每一个k值和b值
param->redSlope = calculateSlope(oldPoint, oldRed, newPoint, newRed);
param->redConstant = calculateConstant(oldPoint, oldRed, newPoint, newRed);
param->greenSlope = calculateSlope(oldPoint, oldGreen, newPoint, newGreen);
param->greenConstant = calculateConstant(oldPoint, oldGreen, newPoint, newGreen);
param->blueSlope = calculateSlope(oldPoint, oldBlue, newPoint, newBlue);
param->blueConstant = calculateConstant(oldPoint, oldBlue, newPoint, newBlue);
param->alphaSlope = calculateSlope(oldPoint, oldAlpha, newPoint, newAlpha);
param->alphaConstant = calculateConstant(oldPoint, oldAlpha, newPoint, newAlpha);
}

以下是实现动态改变颜色的方法

#import "YX_2_ViewController.h"
#import "CalculateColor.h" @interface YX_2_ViewController ()<UIScrollViewDelegate> @property (strong, nonatomic) UIScrollView *mainScrollView; @end @implementation YX_2_ViewController - (void)viewDidLoad
{
[super viewDidLoad]; _mainScrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds];
_mainScrollView.contentSize = CGSizeMake(self.view.bounds.size.width * ,
self.view.bounds.size.height);
_mainScrollView.backgroundColor = [UIColor cyanColor];
_mainScrollView.delegate = self;
[self.view addSubview:_mainScrollView];
} - (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
static SColorParam paramVe2 = {}; // 只计算一次
static int flag = ;
if (flag == ) {
calculateUIColorAndPoint([UIColor cyanColor],
,
[UIColor redColor],
, &paramVe2); flag = ;
} UIColor *color =
[UIColor colorWithRed:scrollView.contentOffset.x * paramVe2.redSlope + paramVe2.redConstant
green:scrollView.contentOffset.x * paramVe2.greenSlope + paramVe2.greenConstant
blue:scrollView.contentOffset.x * paramVe2.blueSlope + paramVe2.blueConstant
alpha:]; scrollView.backgroundColor = color;
} @end

计算一元一次方程Y=kX+b的更多相关文章

  1. C# 列主元素(Gauss)消去法 计算一元多次方程组

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. C# 顺序高斯(Gauss)消去法计算一元多次方程组

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. C语言简单计算一元二次方程

    #include <stdio.h> #include <math.h> /*计算一元二次方程的根*/ void Cal(double a,double b,double c) ...

  4. C++第9周(春)项目5 - 一元一次方程类

    课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 [项目5]设计一元一次方程类.求形如ax+b= ...

  5. 通过C/C++,实现一元一次方程求解

    通过C/C++,实现一元一次方程求解: #include <bits/stdc++.h> using namespace std; string str, str_l, str_r; st ...

  6. C++:补齐函数编写递归函数计算x的y次幂(hhhh函数 !头疼!)

    编写递归函数计算x的y次幂,在主程序中输入非零整数x和整数y,输出求幂的结果(保留两位小数).考虑y为负数和0的情况. #include<iostream> #include<iom ...

  7. ACM_Plants vs. Zombies(一元一次方程)

    Plants vs. Zombies Time Limit: 2000/1000ms (Java/Others) Problem Description: There is a zombie on y ...

  8. C语言初学 计算二元一次方程的问题

    #include<stdio.h> #include<math.h> int main() { double a,b,c,disc,x1,x2; scanf("%lf ...

  9. python解一元一次方程

    将未知数看成是虚数 将常数看成是实数 最终求解. import re class Item: def __init__(self,imag=0,real=0): self.imag = imag se ...

随机推荐

  1. pytest的参数化测试

    感觉在单元测试当中可能有用, 但在django这种框架中,用途另一说. import pytest import tasks from tasks import Task def test_add_1 ...

  2. javascript大神修炼记(6)——OOP思想(继承)

    读者朋友们大家好,我们今天这一讲就接着前面的封装继续讲解,今天就是在前面内容上面的升级,OOP思想中的继承,我们就先来解释一下继承到底是什么意思,我们在什么地方会用到继续. 继承就是,后代继续祖先的一 ...

  3. 本机ip和127.0.0.1的区别

    简介 连接上因特网的每一台计算机都会有一个IP地址, 在linux下可以使用命令ifconfig来查看本机的ip地址(windows为ipconfig), 比如我当前电脑的ip地址为192.168.0 ...

  4. 20172301 《Java软件结构与数据结构》实验一报告

    20172301 <Java软件结构与数据结构>实验一报告 课程:<Java软件结构与数据结构> 班级: 1723 姓名: 郭恺 学号:20172301 实验教师:王志强老师 ...

  5. 在控制台连接oracle

    Microsoft Windows [版本 6.1.7601]版权所有 (c) 2009 Microsoft Corporation.保留所有权利. C:\Users\lijt>sqlplus ...

  6. Keystone几种token生成的方式分析

    从Keystone的配置文件中,我们可见,Token的提供者目前支持四种. Token Provider:UUID, PKI, PKIZ, or Fernet 结合源码及官方文档,我们用一个表格来阐述 ...

  7. opencv 掩膜操作 滤波 卷积核定义 增强对比度 掩膜运算

    /* 矩阵的掩膜操作 0 掩膜mask 在这里进行增强对比度: [ [ 0,-1, 0 ], [-1, 5, -1], [ 0,-1, 0 ] ] 使用mask滑动图片每一个位置,进行卷积运算 这里这 ...

  8. 机器学习之路:python 特征降维 特征筛选 feature_selection

    特征提取: 特征降维的手段 抛弃对结果没有联系的特征 抛弃对结果联系较少的特征 以这种方式,降低维度 数据集的特征过多,有些对结果没有任何关系,这个时候,将没有关系的特征删除,反而能获得更好的预测结果 ...

  9. 【扩展欧几里得】BZOJ1477-青蛙的约会

    一直在WA,后来我发现我把东西看反了…… [题目大意] 给出一个长度为L的环状坐标轴,两个点开始时位于(X,0).(Y,0).每次两点分别往右边移动m和n,问能否相遇? [思路] 由题意,可得: X+ ...

  10. 鸟哥的私房菜:Bash shell(二)-变量的丰富功能

    一  Shell变量的取用与设定,变量规则 由于系统需要一些变量来提供他数据的存取,所以就有一些所谓的『环境变量』 需要来读入系统中了!这些环境变量例如 PATH.HOME.MAIL.SHELL.为了 ...