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