Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 我如何画两条线之间有一定角度,以后可以通过拖动任何线来改变角度_Ios_Iphone_Drawing_Line_Angle - Fatal编程技术网

Ios 我如何画两条线之间有一定角度,以后可以通过拖动任何线来改变角度

Ios 我如何画两条线之间有一定角度,以后可以通过拖动任何线来改变角度,ios,iphone,drawing,line,angle,Ios,Iphone,Drawing,Line,Angle,我想要像app()一样有意义,在那里我需要画两条有一定角度的线,然后我可以通过拖动任何线或交点来调整两条线之间的角度。 你们能给我一些想法或代码片段吗 截图网址: 提前感谢。您有一个包含三个点的构造,一个点是角度点,另外两个点只是顶点。首先,您应该创建一个新类,如下所示: @interface MyAngle : NSObject { } @property (nonatomic) CGPoint p1; @property (nonatomic) CGPoint p2; @propert

我想要像app()一样有意义,在那里我需要画两条有一定角度的线,然后我可以通过拖动任何线或交点来调整两条线之间的角度。 你们能给我一些想法或代码片段吗

截图网址:


提前感谢。

您有一个包含三个点的构造,一个点是角度点,另外两个点只是顶点。首先,您应该创建一个新类,如下所示:

@interface MyAngle : NSObject {

}

@property (nonatomic) CGPoint p1;
@property (nonatomic) CGPoint p2;
@property (nonatomic) CGPoint v; // this is an angle point

@end 
您可以使用此示例初始化的默认实现,而无需任何技巧:

- (id)init {
   if (self = [super init]) {
       p1 = CGPointMake(1,0);
       p2 = CGPointMake(0,1);
       v = CGPointZero;
   }
   return self;
}
但正如我所理解的,你需要知道角度的值。您可以使用以下方法执行此操作:

- (CGFloat)valueOfAngle {
    CGPoint v1 = CGPointMake(p1.x-v.x, p1.y-v.y);
    CGPoint v2 = CGPointMake(p2.x-v.x, p2.y-v.y);

    CGFloat scalarProduct = v1.x*v2.x + v1.y*v2.y;
    CGFloat lengthProduct = sqrt(v1.x*v1.x + v1.y*v1.y)*sqrt(v2.x*v2.x + v2.y*v2.y);
    CGFloat fraction = scalarProduct / lengthProduct;
    if (fraction < -1) fraction = -1;
    if (fraction > 1) fraction = 1;

    return acos(fraction);
}
这就是你画你想要的东西所需要知道的一切!如果需要,可以更改三个圆的笔划颜色或半径

然后你需要有可能改变你的角度点的位置。为此,您可以在viewController的viewDidLoad方法中实现PangestureRecognitor,如下所示:

UIPanGestureRecognizer *pan = [[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(moveAngle:)] autorelease];
pan.delegate = self;
[self.view addGestureRecognizer:pan]; 
实现UIgestureRecognitzerDelegate方法:

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
        CGPoint p = [gestureRecognizer locationInView:self.view];
        CGFloat d1 = sqrt((p.x-angle.p1.x)*(p.x-angle.p1.x) + (p.y-angle.p1.y)*(p.y-angle.p1.y);
        CGFloat d2 = sqrt((p.x-angle.p2.x)*(p.x-angle.p2.x) + (p.y-angle.p2.y)*(p.y-angle.p2.y);
        CGFloat d3 = sqrt((p.x-angle.v.x)*(p.x-angle.v.x) + (p.y-angle.v.y)*(p.y-angle.v.y);

        // just check if we touched the screen near some of angle's points
        CGFloat tolerance = 15.0f;
        return (d1 < tolerance) || (d2 < tolerance) || (d3 < tolerance);
    }
    return YES;
}
-(BOOL)手势识别器应开始:(uigesturecognizer*)手势识别器{
if([GestureRecognitor IsKindof类:[UIPangestureRecognitor类]]){
CGP点=[GestureRecognitor locationInView:self.view];
CGFloat d1=sqrt((p.x-angle.p1.x)*(p.x-angle.p1.x)+(p.y-angle.p1.y)*(p.y-angle.p1.y);
CGFloat d2=sqrt((p.x-angle.p2.x)*(p.x-angle.p2.x)+(p.y-angle.p2.y)*(p.y-angle.p2.y);
CGFloat d3=sqrt((p.x-angle.v.x)*(p.x-angle.v.x)+(p.y-angle.v.y)*(p.y-angle.v.y);
//只需检查我们是否触摸了angle的某些点附近的屏幕
CGFloat公差=15.0f;
返回(d1<公差)| |(d2<公差)| |(d3<公差);
}
返回YES;
}
和tagret的选择器(也在viewController中):

-(void)移动角度:(UIPangestureRecognitor*)gr{
CGPoint=[gr locationInView:self.view];
if(gr.state==UIgestureRecognitizerStateStart){
CGFloat d1=sqrt((p.x-angle.p1.x)*(p.x-angle.p1.x)+(p.y-angle.p1.y)*(p.y-angle.p1.y);
CGFloat d2=sqrt((p.x-angle.p2.x)*(p.x-angle.p2.x)+(p.y-angle.p2.y)*(p.y-angle.p2.y);
CGFloat d3=sqrt((p.x-angle.v.x)*(p.x-angle.v.x)+(p.y-angle.v.y)*(p.y-angle.v.y);
//pointToMove是您的int变量
CGFloat公差=15.0f;
if(d1<公差){
pointToMove=1;
}
否则如果(d2<公差){
pointToMove=2;
}
否则{
pointToMove=3;
}
}
否则{
如果(pointToMove==1){
角度p1=loc;
}
else if(pointToMove==2){
角度p2=loc;
}
否则{
角度v=loc;
}
[您的CustomView设置需要显示];
[yourLabel setText:[NSString stringWithFormat:@“%.3f”,[angle valueOfangle]*180/PI];
}
}

也许我跳过了一些明显的事情,但我认为你应该开始编写一些代码。

picasa url不起作用。谢谢Miroslav。你能提供示例项目吗?也许以后吧。现在我没有时间这样做。嗨Miroslav,如果有时间,请提供示例项目。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
    if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
        CGPoint p = [gestureRecognizer locationInView:self.view];
        CGFloat d1 = sqrt((p.x-angle.p1.x)*(p.x-angle.p1.x) + (p.y-angle.p1.y)*(p.y-angle.p1.y);
        CGFloat d2 = sqrt((p.x-angle.p2.x)*(p.x-angle.p2.x) + (p.y-angle.p2.y)*(p.y-angle.p2.y);
        CGFloat d3 = sqrt((p.x-angle.v.x)*(p.x-angle.v.x) + (p.y-angle.v.y)*(p.y-angle.v.y);

        // just check if we touched the screen near some of angle's points
        CGFloat tolerance = 15.0f;
        return (d1 < tolerance) || (d2 < tolerance) || (d3 < tolerance);
    }
    return YES;
}
- (void)moveAngle:(UIPanGestureRecognizer *)gr {
    CGPoint p = [gr locationInView:self.view];

    if (gr.state == UIGestureRecognizerStateBegan) {
        CGFloat d1 = sqrt((p.x-angle.p1.x)*(p.x-angle.p1.x) + (p.y-angle.p1.y)*(p.y-angle.p1.y);
        CGFloat d2 = sqrt((p.x-angle.p2.x)*(p.x-angle.p2.x) + (p.y-angle.p2.y)*(p.y-angle.p2.y);
        CGFloat d3 = sqrt((p.x-angle.v.x)*(p.x-angle.v.x) + (p.y-angle.v.y)*(p.y-angle.v.y);

        // pointToMove is your int variable
        CGFloat tolerance = 15.0f;
        if (d1 < tolerance) {
            pointToMove = 1;
        }
        else if (d2 < tolerance) {
            pointToMove = 2;
        }
        else {
            pointToMove = 3;
        }
    }
    else {
        if (pointToMove == 1) {
            angle.p1 = loc;
        }
        else if (pointToMove == 2) {
            angle.p2 = loc;
        }
        else {
            angle.v = loc;
        }
        [yourCustomView setNeedsDisplay];
        [yourLabel setText:[NSString stringWithFormat:@"%.3f", [angle valueOfangle]*180/PI]];
    }
}