圆环,扇形控件基本算法一种实现 - 代码库 - CocoaChina_让移动开发更简单

 

//
//  CircleCore.h
//  Quartz
//
//  Created by 仙人掌 on 12-11-5.
//  Copyright (c) 2012年 仙人掌. All rights reserved.
//

#import

#define ToRad( degree ) ( degree * M_PI / 180 )

#define ToDeg( rad )    ( rad / M_PI * 180 )

#define ZERO_DEGREE     (-90.0f)

typedef enum{
    PT_DONE   = 0,
    PT_UNDONE,
}Path_Type;

typedef struct CircleData{
    CGPoint center;
    CGFloat radius;
}CircleData;

CircleData CircleDataMake(CGPoint center, CGFloat radius);
CGFloat DistanceBetweenPoints(CGPoint point1,CGPoint point2);
@interface CircleCore : NSObject{
    CGFloat referenceDegree_;
    CGFloat currentDegree_;
    CircleData smallCircle_;
    CircleData largeCircle_;
}
@property( nonatomic ) CGFloat referenceDegree;
@property( nonatomic ) CGFloat currentDegree;
@property( nonatomic ) CircleData smallCircle;
@property( nonatomic ) CircleData largeCircle;
-(CGMutablePathRef)GetPathForMode:(Path_Type)pathType;
-(BOOL)PointInPathWithPoint:(CGPoint)point BetweenDegree:(CGFloat)start And:(CGFloat)end;
@end
//-----------------------------------------------------------------------------------------------------------------------------------------------------
//
//  CircleCore.m
//  Quartz
//
//  Created by 仙人掌 on 12-11-5.
//  Copyright (c) 2012年 仙人掌. All rights reserved.
//

#import "CircleCore.h"

CircleData CircleDataMake(CGPoint center, CGFloat radius){
    CircleData myCircleData;
    myCircleData.center = center;
    myCircleData.radius = radius;
    return myCircleData;
}
CGFloat DistanceBetweenPoints(CGPoint point1,CGPoint point2){
    CGFloat temp = ( point1.x - point2.x ) * ( point1.x - point2.x ) + ( point1.y - point2.y ) * ( point1.y - point2.y );
    return ( CGFloat )sqrt( temp );
}

@interface CircleCore(Pravite)
-(CGMutablePathRef)GetPathForMode_DONE;
-(CGMutablePathRef)GetPathForMode_UNDONE;
-(CGPoint)GetPointWithCircle:(CircleData)circle AtDegree:(CGFloat)degree;

@end

@implementation CircleCore(Pravite)
-(CGPoint)GetPointWithCircle:(CircleData)circle AtDegree:(CGFloat)degree{
    CGFloat x,y;
    x = circle.center.x + cos( ToRad( degree ) ) * circle.radius;
    y = circle.center.y + sin( ToRad( degree ) ) * circle.radius;
    return CGPointMake( x, y );
}
-(CGMutablePathRef)GetPathForMode_DONE{
    CGMutablePathRef resultPath = CGPathCreateMutable();
    
    CGPoint smallCircle_referencePoint = [self GetPointWithCircle:smallCircle_ AtDegree:referenceDegree_];
    CGPoint largeCircle_referencePoint = [self GetPointWithCircle:largeCircle_ AtDegree:referenceDegree_];
    CGPoint smallCircle_currentPoint = [self GetPointWithCircle:smallCircle_ AtDegree:currentDegree_];
    CGPathMoveToPoint( resultPath, NULL, smallCircle_referencePoint.x, smallCircle_referencePoint.y );
    CGPathAddLineToPoint( resultPath, NULL, largeCircle_referencePoint.x, largeCircle_referencePoint.y );
    CGPathAddArc( resultPath, NULL, smallCircle_.center.x, smallCircle_.center.y, largeCircle_.radius, ToRad( referenceDegree_ ), ToRad( currentDegree_ ), 0 );
    CGPathAddLineToPoint( resultPath, NULL, smallCircle_currentPoint.x, smallCircle_currentPoint.y );
    CGPathAddArc( resultPath, NULL, smallCircle_.center.x, smallCircle_.center.y, smallCircle_.radius, ToRad( currentDegree_ ), ToRad( referenceDegree_ ), 1 );

return resultPath;
}

-(CGMutablePathRef)GetPathForMode_UNDONE{
    CGMutablePathRef resultPath = CGPathCreateMutable();
    CGPoint largeCircle_referencePoint = [self GetPointWithCircle:largeCircle_ AtDegree:referenceDegree_];
    CGPoint smallCircle_currentPoint = [self GetPointWithCircle:smallCircle_ AtDegree:currentDegree_];
    
    CGPathMoveToPoint(resultPath, NULL, largeCircle_referencePoint.x, largeCircle_referencePoint.y);
    CGPathAddArc(resultPath, NULL, largeCircle_.center.x, largeCircle_.center.y, largeCircle_.radius, ToRad(referenceDegree_), ToRad(currentDegree_), 1);
    CGPathAddLineToPoint(resultPath, NULL, smallCircle_currentPoint.x, smallCircle_currentPoint.y);
    CGPathAddArc(resultPath, NULL, smallCircle_.center.x, smallCircle_.center.y, smallCircle_.radius, ToRad(currentDegree_), ToRad(referenceDegree_), 0);
    CGPathAddLineToPoint(resultPath, NULL, largeCircle_referencePoint.x, largeCircle_referencePoint.y);
    return resultPath;
}
@end

@implementation CircleCore
@synthesize referenceDegree = referenceDegree_;
@synthesize currentDegree = currentDegree_;
@synthesize smallCircle = smallCircle_;
@synthesize largeCircle = largeCircle_;
-(id)init{
    self  = [super init];
    if ( nil != self){
        referenceDegree_ = ZERO_DEGREE;
        referenceDegree_ = ZERO_DEGREE;
    }
    return self;
}
-(CGFloat)referenceDegree{
    return referenceDegree_ - ZERO_DEGREE;
}

-(void)setReferenceDegree:(CGFloat)referenceDegree{
    referenceDegree_ = referenceDegree + ZERO_DEGREE;
}

-(void)setCurrentDegree:(CGFloat)currentDegree{
    currentDegree_ = currentDegree + ZERO_DEGREE;
}

-(CGFloat)currentDegree{
    return currentDegree_ - ZERO_DEGREE;
}

-(CGMutablePathRef)GetPathForMode:(Path_Type)pathType{
    switch (pathType) {
        case PT_DONE:
            return [self GetPathForMode_DONE];
        case PT_UNDONE:
            return [self GetPathForMode_UNDONE];
        default:
            return NULL;
    }
}
-(BOOL)PointInPathWithPoint:(CGPoint)point BetweenDegree:(CGFloat)start And:(CGFloat)end{
    CGFloat distance = DistanceBetweenPoints( point, largeCircle_.center );
    if ( distance > largeCircle_.radius || distance < smallCircle_.radius )
        return NO;
    CGFloat base_degree = 0.0f;
    NSInteger flag = 0;
    CGPoint base_point = CGPointMake( point.x - largeCircle_.center.x, largeCircle_.center.y - point.y );
    if ( base_point.x >= 0.0f && base_point.y >= 0.0f ){ //第一象限
        base_degree = 0.0f;
        flag = 1;
    }
    else if ( base_point.x < 0 && base_point.y >= 0 ){  //第二象限
        base_degree = 360.0;
        flag = 2;
    }
    else if ( base_point.x <0 && base_point.y < 0 ){   //第三象限
        base_degree = 180.0f;
        flag = 3;
    }
    else{                                              //第四象限
        base_degree = 180.0f;
        flag = 4;
    }
//
    CGFloat x = ABS( base_point.x );
    double temp_rad = asin( x / distance );
    CGFloat result = 0.0f;
    if ( 1 == flag || 3 == flag )
        result = ToDeg( temp_rad ) + base_degree;
    else
        result = base_degree - ToDeg( temp_rad );
    if ( result >= start  && result <= end )
        return YES;
    else
        return NO;
}
@end

圆环,扇形控件基本算法一种实现 - 代码库 - CocoaChina_让移动开发更简单的更多相关文章

  1. 屏蔽webbrowser控件右键的一种方法

    原文:屏蔽webbrowser控件右键的一种方法 Option ExplicitPrivate Declare Sub ZeroMemory Lib "KERNEL32" Alia ...

  2. WPF编程,通过Double Animation动态更改控件属性的一种方法。

    原文:WPF编程,通过Double Animation动态更改控件属性的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/a ...

  3. WPF编程,通过【帧】动态更改控件属性的一种方法。

    原文:WPF编程,通过[帧]动态更改控件属性的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/detail ...

  4. [转]MFC子线程中更新控件内容的两种办法

    一.概述 每个系统中都有线程(至少都有一个主线程),而线程最重要的作用就是并行处理,提高软件的并发率.针对界面来说,还能提高界面的响应能力.一般的,为了应用的稳定性,在数据处理等耗时操作会单独在一个线 ...

  5. C# WinForm中 让控件全屏显示的实现代码

    夏荣全 ( lyout(at)163.com )原文 C#中让控件全屏显示的实现代码(WinForm) 有时候需要让窗口中某一块的内容全屏显示,比如视频播放.地图等等.经过摸索,暂时发现两种可行方法, ...

  6. Devexpress treelist 树形控件 实现带三种状态的CheckBox

    树形控件是使用频率很高的一种控件.对于属性控件往往需要下面两个功能 1.TreeList带有CheckBox,并且节点要有三种状态(所有的子节点都选中,所有的子节点都没选择,一部分子节点选中).使用 ...

  7. VC 对话框背景颜色、控件颜色(三种方法)

    系统环境:Windows 7软件环境:Visual C++ 2008 SP1本次目的:为对话框设置背景颜色.控件颜色 既然MFC对话框不好开发,那么现在我们来开始美化我们的对话框.为对话框设置背景颜色 ...

  8. C#自动实现Dll(OCX)控件注册的两种方法

    尽管MS为我们提供了丰富的.net framework库,我们的程序C#开发带来了极大的便利,但是有时候,一些特定功能的控件库还是需要由第三方提供或是自己编写.当需要用到Dll引用的时候,我们通常会通 ...

  9. 【Winform-自定义控件】可以使用2种半透明的颜色来填充Button

    制作一个自定义按钮,使用2种半透明的颜色来填充Button 1.添加一个自定义控件类,并改变基类,继承自Button public partial class CustomControl1 : But ...

随机推荐

  1. linux新建用户切换后显示-bash-4.1$(转载)

    今天新建了一个MQM的用户 , [plain] view plaincopy useradd -g mqm -d /var/mqm passwd mqm 终端中显示 -bash-4.1$而不是 [mq ...

  2. VMware下安装Linux(Centos)步骤

    VMware下安装Linux(Centos)步骤 准备步骤:(安装软件教程采用 VMware 9 .Centos6.5 为例) 启动VMware的画面 点击File--->New Virtua ...

  3. Java实现内存分配算法 FF(首次适应算法) BF(最佳适应算法)

    一.概述 因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示. MemoryAlgorithm类里只是和控制台输入输出有关的操作,而对内存的所有逻辑操作都是用Mem ...

  4. 初步理解impress.js

    1.认识impress.js impress.js 采用 CSS3 与 JavaScript 语言完成的一个可供开发者使用的表现层框架(演示工具). 现在普通开发者可以利用 impress.js 自己 ...

  5. ES6,先知道这些必会的才行

    变量声明 const 和 let 不要用 var,而是用 const 和 let,分别表示常量和变量.不同于 var 的函数作用域,const 和 let 都是块级作用域. const DELAY = ...

  6. autocomplete 属性 清除input框输入存留历史值,防止下拉历史值显示

    autocomplete 属性规定输入字段是否应该启用自动完成功能. 自动完成允许浏览器预测对字段的输入.当用户在字段开始键入时,浏览器基于之前键入过的值,应该显示出在字段中填写的选项. 注释:aut ...

  7. 解决Non-resolvable parent POM: Could not find artifact 出现的问题

    在编译spring boot 多模块项目的时候,往往出现 Non-resolvable parent POM: Could not find artifact 后面跟一串其它信息,网上大部分解决方案是 ...

  8. ES入门——数组的扩展

    1.Array.from() 该方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象,包括ES6新增的数据结构Set和Map.下面是 ...

  9. 生命不息学习不止,前端js学习笔记(一)

    引言 从毕业到年已经整整7年,期间一直从事.net开发做c/s从 c# 转到 wpf 而后又开始做b/s 用silverlight,从最开始的arcgis engine 到后来的silverlight ...

  10. HTML,javascript,image等加载,DOM解析,js执行生命周期