【问题标题】:Rotate around circle绕圈旋转
【发布时间】:2013-01-09 15:56:02
【问题描述】:

我需要在目标c中实现以下应用程序>> http://bit.ly/rHzVkF

如何通过在应用程序中拖动来旋转圆圈?你知道一些类似的例子吗?

【问题讨论】:

  • 很抱歉人们对您的问题投了反对票...他们害怕任何需要 30 多秒才能回答的问题...您正在努力学习这些东西是件好事。一开始很困难,因为这些论坛上的每个人都因为你生来就不知道所有基本代码而不断关闭你。
  • 在我看来,这个问题不符合最低质量标准:很明显,OP 没有投入任何研究费用,要理解这个问题,你必须离开。投票结束,因为没有建设性。
  • @AlbertRenshaw,我认为这里有很多人,他们投入了大量时间来回答。检查我的 github 帐户。你会发现很多我刚刚写的代码来回答问题。但我觉得我不想回答不到 30 秒的问题。
  • 我已经投入了研究,但我还没有理解它。我不是在寻找一个完整的解决方案,我只需要帮助来了解我应该如何开始。
  • @ihkawiss 你知道怎么用 cocoa-touch 画圆吗?

标签: ios objective-c cocoa-touch drag-and-drop geometry


【解决方案1】:

在您的 touches started 方法中,您需要检查 x 和 y 并查看它是否在两个旋转标签的边界内。

现在,在您移动触摸时,您需要检测 x 和 y 位置的变化(增量)并使用 ATAN2(dx,dy) 我相信它会转换为弧度以进行旋转。如果我错了你可以在纸上算出来,这是简单的三角函数(别忘了导入<Math.h>

有了这个用于旋转的新变量,使用CGAffineTransformRotate(); 将它应用到您想要旋转的对象上(我相信这是 Core Graphics 的一部分,因此请确保您也已导入该库)。

【讨论】:

    【解决方案2】:

    @ihkawiss 你知道如何用 cocoa-touch 画一个圆圈吗? – vikingosegundo

    @ihkawiss,我猜,你不想回答我。没问题。你的任务需要分成更小的任务。

    1. 在给定的默认位置(手柄)上绘制小圆圈
    2. 画大圆
    3. 获取触摸坐标并检查,如果它在手柄内,则继续下一个点。
    4. 计算圆心、触摸位置和固定点(即:顶部中心)之间的角度。
    5. 用圆的角度、定点和半径计算手柄的新位置
    6. 只要触发触摸,就可以重新绘制所有内容。

    您应该能够为网络中的每个步骤和堆栈溢出获得足够的信息。如果你卡住了(这是很正常的,也是意料之中的),回来,展示你到目前为止所得到的,并解释你卡在哪里。

    【讨论】:

    • vikingosegundo,感谢您的回答!抱歉昨天没时间回答。我会试试这个步骤。 ihkawiss
    【解决方案3】:

    我将尝试将我的两分钱投入其中,因为我只需要解决类似的情况。

    您必须在要处理所有移动的视图中实现触摸方法

    • (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    • (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    • (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

    Albert 写的对,您需要检测 x 和 y 位置的变化。您可以在方法触发时从发送到方法的 NSSet 中获取位置。

    在方法中,您需要实现此代码的一些变体才能使用触摸数据:

    for(UITouch *t in touches){
        if([t tapCount] > 1){
            return;
        }
        CGPoint loc = [t locationInView:self.view];
    

    获得用户触摸位置的 x 和 y(在本例中为 CGPoint loc)后,您可以运行 math.h 库中的 atan2 方法并获取圆的弧度。您需要 #include 才能使用 atan2()

    atan2() 需要两个参数才能工作,两个 y 点和两个 x 点之间的差异。在我的例子中,我使用了当前(触摸 y 点,- 圆心 y)和当前(触摸 x 点,- 圆心 x)。

        double rads = atan2((loc.y - (self.frame.size.height/2)), (loc.x - (self.frame.size.width/2))); 
    

    从那里您可以使用该信息执行任意数量的操作。要计算圆周围的新 x 和 y 位置,您需要利用 cosine 和 sine 函数来计算正确的坐标。

       newXposition = CenterX + cos(rads) * radiusOfCircle
       newYposition = CenterY + sin(rads) * radiusOfCircle
    

    您可以通过将圆的中心 X 位置添加到 cos 的结果(输入我们刚刚得到的弧度)乘以圆的半径来获得新的 xPosition 并且通过执行以下操作获得新的 yposition同样的事情只是用 sin() 代替。

    所以我的代码看起来像这样......

        float radius = 61;
        float newXPos = 140 + (cos(rads) * radius);
        float newYPos = 165 + (sin(rads) * radius);
    

    祝你好运,希望这可以帮助你开始。这东西可能很棘手

    【讨论】:

      猜你喜欢
      • 2019-04-25
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      相关资源
      最近更新 更多