【问题标题】:Semi circle between 2 CGPoints2个CGPoints之间的半圆
【发布时间】:2020-01-14 22:22:47
【问题描述】:

我想在一个圆的两点之间画一个半圆。 main 代表一个时钟,我想画另一条线来表示从一个小时到另一个小时的进度,因此点的位置可能会有所不同。首先,我知道我感兴趣的 2 个点的 X 和 Y。这就是我尝试在 UIBezierPath 中添加角度的方式。我的问题是新圈子开始正确但在完全随机的位置结束

let firstAngle = atan2(redPoint.y - circleCenter.y, redPoint.x - circleCenter.x)

let secondAngle = atan2(bluePoint.y - circleCenter.y, bluePoint.x - circleCenter.x) ```

    let circlePath1 = UIBezierPath(arcCenter: circleCenter,
                                   radius: circleRadius,
                                   startAngle: firstAngle,
                                   endAngle: secondAngle,
                                   clockwise: true) ```

无论我在哪里设置红点,圆圈从正确的位置开始,但圆圈永远不会在蓝点。

【问题讨论】:

  • 我在这里摆姿势时更改了变量名称,以使问题更易于理解。现在更改它以显示正确
  • 我找不到与您的代码有关的问题。确保您对点和角度使用相同的坐标空间。我发现这个游乐场有助于测试贝塞尔路径:github.com/DigitalLeaves/BezierPathPlaygrounds

标签: ios swift xcode uibezierpath cashapelayer


【解决方案1】:

我已经尝试过你的代码,如果 points 实际上 oncircumference

    let redPoint = CGPoint(x: 100.0, y: 200.0)
    let bluePoint = CGPoint(x: 100.0, y: 0.0)
    let circleCenter = CGPoint(x: 100.0, y: 100.0)

    let circleRadius = CGFloat(100.0)

    let firstAngle = atan2(redPoint.y - circleCenter.y, redPoint.x - circleCenter.x)

    let secondAngle = atan2(bluePoint.y - circleCenter.y, bluePoint.x - circleCenter.x)

    let path = UIBezierPath(arcCenter: circleCenter,
                                radius: circleRadius,
                                startAngle: firstAngle,
                                endAngle: secondAngle,
                                clockwise: true)

    //Path in layer
    let shapeLayer = CAShapeLayer()
    shapeLayer.path = path.cgPath
    shapeLayer.strokeColor = UIColor.red.cgColor
    shapeLayer.lineWidth = 1.0

    self.view.layer.addSublayer(shapeLayer)

或者例如:

    let redPoint = CGPoint(x: 200.0, y: 100.0)
    let bluePoint = CGPoint(x: 100.0, y: 0.0)
    let circleCenter = CGPoint(x: 100.0, y: 100.0)

    let circleRadius = CGFloat(100.0)

你得到:

但是,如果您使用的坐标实际上不在您的圆周上,则会得到错误的结果。我的建议是检查您的输入,并最终检查点是否属于您想要的圆周。

【讨论】:

  • 谢谢。我发现了我的错误。那是在将当前时间转换为主圆上的一个点时。我没有从圆原点进行数学运算,而是将另一点作为参考,所以它把一切都搞砸了。谢谢你的详细回答
【解决方案2】:

你这样做是倒退的。不要试图从红色和蓝色小圆圈的位置开始来获得角度。使用角度放置红色和蓝色填充的小圆圈。

在那个例子中,我的角度是 -1 和 2.8(弧度)。首先我画出弧线(就像你做的那样);然后我将圆叠加起来,这很简单,因为通过将极坐标转换为笛卡尔坐标,我知道它们的中心在哪里(弧的端点)。

【讨论】:

  • 您能详细说明一下吗?问题不是色点,问题是弧线。这些点代表时钟上的特定小时,因此弧线必须在 2 个点之间。我在代码中得到的输入例如 point1=09h:40m point2=18h:25m
  • 我不知道如何将 09h:40m 表示为圆上的一个点。我不知道你想让我详细说明什么。我画了你说你想画的东西,我告诉你我是怎么做到的。如果你给我任何两个角度,就会发生相同的绘图
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
  • 1970-01-01
  • 2020-12-21
  • 1970-01-01
相关资源
最近更新 更多