【问题标题】:Stretching an ellipse made of bezier curves to fit view bounds拉伸由贝塞尔曲线组成的椭圆以适应视图边界
【发布时间】:2012-07-14 08:06:33
【问题描述】:

我在 Illustrator 中创建了一个特殊的椭圆,我需要在我的应用程序中绘制它。我使用 Qwarkee 将其转换为核心图形代码,主要使用:

void CGPathAddCurveToPoint (CGMutablePathRef path, const CGAffineTransform *m, CGFloat cp1x, CGFloat cp1y, CGFloat cp2x, CGFloat cp2y, CGFloat x, CGFloat y);

代码如下:

CGMutablePathRef pPath_0 = CGPathCreateMutable();
CGPathMoveToPoint(pPath_0, NULL, 515.98,258.24);
CGPathAddCurveToPoint(pPath_0, NULL, 515.98,435.61,415.54,515.98,258.24,515.98);
CGPathAddCurveToPoint(pPath_0, NULL, 100.94,515.98,0.50,435.61,0.50,258.24);
CGPathAddCurveToPoint(pPath_0, NULL, 0.50,80.86,100.94,0.50,258.24,0.50);
CGPathAddCurveToPoint(pPath_0, NULL, 415.54,0.50,515.98,80.86,515.98,258.24);
CGPathCloseSubpath(pPath_0);

这个比例大小的椭圆的直径是 515.98。现在我想更改代码,以便无论大小如何,椭圆都会被拉伸以适合我的视图边界。端点很明显,我可以使用视图的高度和宽度来确定这一点。但是,我无法理解如何确定控制点。我是否将这些视为视图高度/视图宽度的比例?不确定我是否完全理解贝塞尔路径的数学运算,因此当视图水平或垂直拉伸时,我可以保持相同数量的曲线。

【问题讨论】:

  • 您是否尝试过使用CGContextScaleCTM() 来扩展整个上下文?我相信这将使您保持所有绘图原样;您只需传递您假设的宽度/高度与视图实际具有的宽度/高度的比例。
  • 你知道是否可以拉伸 mutablePath 吗? @KevinGrant
  • “我是否将这些视为视图高度/视图宽度的比例?”好吧,如果您尝试这样做会发生什么? (提示:它应该可以正常工作。)
  • @CoDEFRo 我不认为您可以缩放路径,您可以在添加每个元素时对其应用转换(上面所有调用中的 NULL 参数)或缩放上下文在你画东西之前。
  • 您可以通过使用CGPathCreateCopyByTransformingPathCGPathCreateMutableCopyByTransformingPath 应用缩放变换来缩放路径。应该相当于@KevinGrant 提到的两种方式。

标签: iphone ios cocoa-touch geometry core-graphics


【解决方案1】:

我在一个物理论坛上交叉发布了这个,一个好人给了我一个很好的解决方案:

http://www.physicsforums.com/showthread.php?s=aff26efd9c911d2a8c29118f550b86fb&p=3996775#post3996775

【讨论】:

    猜你喜欢
    • 2011-08-07
    • 2012-12-19
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多