Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/99.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 core图形中以固定间隔获取CGRect椭圆上的点_Ios_Core Graphics_Uibezierpath - Fatal编程技术网

在ios core图形中以固定间隔获取CGRect椭圆上的点

在ios core图形中以固定间隔获取CGRect椭圆上的点,ios,core-graphics,uibezierpath,Ios,Core Graphics,Uibezierpath,我正在画一个椭圆 CGRect paperRect = self.bounds; CGRect strokeRect = CGRectInset(paperRect, 5.0, 5.0); CGContextAddEllipseInRect(context, strokeRect); CGContextStrokePath(context); 如何获取椭圆上的点(等距或等距),以便使用CGContextAddArcToPoint一次连接两个相邻点(在循环中覆盖所有点) 目标是得到一个椭圆,其边

我正在画一个椭圆

CGRect paperRect = self.bounds;
CGRect strokeRect = CGRectInset(paperRect, 5.0, 5.0);
CGContextAddEllipseInRect(context, strokeRect);
CGContextStrokePath(context);
如何获取椭圆上的点(等距或等距),以便使用
CGContextAddArcToPoint
一次连接两个相邻点(在循环中覆盖所有点)


目标是得到一个椭圆,其边界由较小的圆弧组成。正在寻求帮助。

我可能会给你一些指导。我想你有几何学的基本知识。
对于这种要求,如果你在极坐标下工作,会容易得多。在椭圆周长上寻找等距点应该与在圆周长上寻找点非常相似,只是在这两种情况下方程会有所不同。
以下链接点指向极坐标中的椭圆方程。
你们应该能够很容易地找到circle案例的代码。以下是一些相关链接


这就是您的代码大致的样子

for (theta = 0 -> 360 degrees)
{
    r = ellipse_equation(theta);
    x = r*cos(theta) + h;//(h,k) is the center of the ellipse. You need to consider this translation if your ellipse is not centered at origin.
    y = r*sin(theta) + k;
    //Use these (x,y) values as you want
}

如果椭圆的中心不在原点,请记住所需的平移。根据需要为
循环选择增量。你可以将θ值的弧度范围从
0
2*PI
来代替度。

就像许多三角函数一样,这比看起来容易

首先对圆执行此操作,这要简单得多,因为距离和角度始终保持不变:

  • 将圆的周长拆分为气球上所需的尖峰数量

  • 从这些点中选择任意一个作为起点

  • 计算它相对于气球中心的位置,然后移动到它

  • >P>从每个尖峰点,计算下一个尖峰点,然后在两者之间找到中间点。
  • 将该中点用作
    arcto
    的中心。这将类似于
    CGContextAddArcToPoint(上下文,midPoint.x,midPoint.y,nextSpikePoint.x,nextSpikePoint.y,radius)

    radius
    这里是两个尖峰之间山谷的深度。您可以硬编码,使其用户可编辑,使其取决于气球大小,使用从起始尖峰点到中点的距离,或将最后一个尖峰点乘以某个值。)

    弧线是将曲线置于每对尖峰之间的东西。我相信弧线总是逆时针的,所以你可以改变你绕气球的方向,以逆时针或顺时针的顺序取点来改变你是画一个呼喊气球还是一个思想气球

  • 清洗、漂洗、重复,直到回到步骤2中开始的峰值

  • 关闭路径,将尾部绘制为一个单独的子路径,对它们进行笔划,然后填充它们。(笔划将留下重叠线;填充将覆盖这些线。)

  • 第一步是一种非步骤:你真正要做的就是决定你想要多少分。您可以先硬编码一些点,然后根据气球的周长使其可变

    要从周长导出它,您需要考虑尖峰点之间的特定距离(特别是如果您想要特定半径,例如,使用点之间距离的一半作为半径)。你可以将周长除以这个距离,然后绕一圈或另一圈(或者选择你的起点,让剩下的部分被气球的尾部覆盖)

    计算圆的周长 这是众所周知的:

    circ = radius² × π
    
    (或者,更为著名和简洁的说法是,“πr²”。)

    两点之间的距离 问问毕达哥拉斯吧

    这里要做的是把两点当作直角三角形的角点,然后计算三角形的斜边。我不会重复这个定理,因为在C数学库中有一个方便的函数:

    #include <tgmath.h>
    
    CGSize size = {
       fabs(nextPoint.x - currentPoint.x),
       fabs(nextPoint.y - currentPoint.y)
    };
    distance = hypot(size.width, size.height);
    
    您将使用相同的方法来查找两个尖峰点之间的中点:通过它们之间假想线的角度,以及该线距离的一半。将结果数字添加到当前点以获得中点

    寻找中点:替代方法 另一种查找两个尖峰点之间中点的方法是将点之间的角度的一半添加到当前点的角度(从气球中心),然后查找相同半径处该角度的终点

    该点实际上将沿着气球圆的圆周(不是在直线上)。这两者之间的关系并不十分重要;使用最有效且最简单的方法

    现在,如何对一个椭圆做所有这些 这是一个正循环。棘手的部分是将其推广到任何椭圆

    (因为所有的正方形都是矩形,所以所有的圆都是椭圆,反之亦然:因为不是所有的矩形都是正方形,所以不是所有的椭圆都是圆。)

    现在,我可以做所有的数学运算,编写一个测试应用程序,解决如何对椭圆执行上述所有操作,但我建议您改为使用仿射变换

    注意:不要在上下文中应用转换。将其应用于路径。

    您所需要做的就是创建一个仿射变换,该变换以非均匀方式缩放,即宽度大于高度,反之亦然。在Cocoa中,您可以创建NSAffinetTransform并将其发送到scaleXBy:yBy:
    。在Quartz中,使用CGAffineTransformMakeScale

    然后,将此变换应用于路径。对于NSBezierPath,发送它
    TransformUsingAffinetTransform:
    并传递NSAffinetTransform对象。对于UIBezierPath,发送它
    applyTransform:
    并传递
    CGAffineTransform
    结构。对于CGPath,请使用
    CGPathCreateCopyByTransformingPath
    。将路径直接绘制到上下文中在这里不起作用,因为您无法
    static CGPoint pointFromPolar(CGFloat theta, CGFloat radius) {
        return (CGPoint){
            cos(theta) * radius,
            sin(theta) * radius
        };
    }