atan2(y,x)在180°处具有不连续性,其顺时针切换到-180°..0°.
如何将值范围映射到0°.360°?
这是我的代码:
CGSize deltaPoint = CGSizeMake(endPoint.x - startPoint.x, endPoint.y - startPoint.y);
float swipeBearing = atan2f(deltaPoint.height, deltaPoint.width);
Run Code Online (Sandbox Code Playgroud)
在给定startPoint和endPoint两个XY点结构的情况下,我正在计算滑动触摸事件的方向.该代码适用于iPhone,但任何支持atan2f()的语言都可以.
感谢您的帮助,包括一般解决方案和代码.
更新:我将erikkallen的答案变成了一个具有漂亮的长变量名的函数,所以我将在6个月后理解它.也许它会帮助其他一些iPhone noob.
float PointPairToBearingDegrees(CGPoint startingPoint, CGPoint endingPoint)
{
CGPoint originPoint = CGPointMake(endingPoint.x - startingPoint.x, endingPoint.y - startingPoint.y); // get origin point to origin by subtracting end from start
float bearingRadians = atan2f(originPoint.y, originPoint.x); // get bearing in radians
float bearingDegrees = bearingRadians * (180.0 / M_PI); // convert to degrees
bearingDegrees = (bearingDegrees > 0.0 ? bearingDegrees : (360.0 + …Run Code Online (Sandbox Code Playgroud) 我想知道是否有人可以准确区分这些?据我所知,Core Graphics只是一个包含Quartz Core和Quartz 2D的"Framework Package".但我不确定Quartz 2D是否真的是Quartz Core?也许有人可以在那里画一些线?是什么构成了这些之间的差异?
在查看文档时,我看到Quartz Core仅列出了所有Core Animation的内容.那么Quartz Core ==核心动画?
对于我正在构建的应用程序,我绘制了2个圆圈.一个比另一个大一点.我想在这些行之间弯曲文本,以便建立一个圆形菜单.
我阅读了关于弯曲文本的大部分内容,你必须将文本分成字符,然后用正确的角度绘制每个字符(通过旋转你正在绘制的上下文).
我无法绕过如何为我的角色获得正确的角度和位置.
我在屏幕截图中列出了目前菜单的样子.只有我添加的文本是从UIImageView中的图像加载的.

我希望有人可以在某些方面为我提供一些关于如何在白色圆圈中绘制文字的起点.
编辑:好的,我目前正在这一点上:

我通过使用以下代码完成:
- (UIImage*) createMenuRingWithFrame:(CGRect)frame
{
CGRect imageSize = CGRectMake(0,0,300,300);
float perSectionDegrees = 360 / [sections count];
float totalRotation = 90;
char* fontName = (char*)[self.menuItemsFont.fontName cStringUsingEncoding:NSASCIIStringEncoding];
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, imageSize.size.width, imageSize.size.height, 8, 4 * imageSize.size.width, colorSpace, kCGImageAlphaPremultipliedFirst);
CGContextSetTextMatrix(context, CGAffineTransformIdentity);
CGContextSelectFont(context, fontName, 18, kCGEncodingMacRoman);
CGContextSetRGBFillColor(context, 0, 0, 0, 1);
CGPoint centerPoint = CGPointMake(imageSize.size.width / 2, imageSize.size.height / 2);
double radius = (frame.size.width / 2);
CGContextStrokeEllipseInRect(context, CGRectMake(centerPoint.x - (frame.size.width / 2), centerPoint.y …Run Code Online (Sandbox Code Playgroud) 我试图将内容绘制scrollview到一个PDF上下文中,我正面临着问题pagination.
以下代码我使用过:
- (void)renderTheView:(UIView *)view inPDFContext:(CGContextRef)pdfContext
{
// Creating frame.
CGFloat heightOfPdf = [[[self attributes] objectForKey:SRCPdfHeight] floatValue];
CGFloat widthOfPdf = [[[self attributes] objectForKey:SRCPdfWidth] floatValue];
CGRect pdfFrame = CGRectMake(0, 0, widthOfPdf, heightOfPdf);
CGRect viewFrame = [view frame];
if ([view isKindOfClass:[UIScrollView class]])
{
viewFrame.size.height = ((UIScrollView *)view).contentSize.height;
[view setFrame:viewFrame];
}
// Calculates number of pages.
NSUInteger totalNumberOfPages = ceil(viewFrame.size.height/heightOfPdf);
// Start rendering.
for (NSUInteger pageNumber = 0; pageNumber<totalNumberOfPages; pageNumber++)
{
// Starts our first page.
CGContextBeginPage …Run Code Online (Sandbox Code Playgroud) 给定a UIImage和a CGRect,绘制与CGRect(不缩放)对应的图像部分的最有效方式(在内存和时间上)是什么?
作为参考,这是我目前的做法:
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGRect frameRect = CGRectMake(frameOrigin.x + rect.origin.x, frameOrigin.y + rect.origin.y, rect.size.width, rect.size.height);
CGImageRef imageRef = CGImageCreateWithImageInRect(image_.CGImage, frameRect);
CGContextTranslateCTM(context, 0, rect.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, rect, imageRef);
CGImageRelease(imageRef);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,对于中等大小的图像和高setNeedsDisplay频率,这似乎非常慢.使用UIImageView框架并clipToBounds产生更好的结果(灵活性较低).
我需要在Draw应用程序的末尾用箭头绘制线条.我不擅长三角学,所以无法解决这个问题.
用户将手指放在屏幕上并沿任何方向画线.因此,箭头应出现在行尾.
我正在为iOS制作一款相当简单的2D塔防游戏.
到目前为止,我一直在使用Core Graphics专门处理渲染.应用程序中根本没有图像文件(尚未).我一直在经历一些相对简单的绘图时出现的重大性能问题,我正在寻找关于如何解决这个问题的想法,而不是转向OpenGL.
在高层次上,我有一个Board类,它是UIView代表游戏板的子类.游戏中的所有其他对象(塔,小兵,武器,爆炸等)也是子类UIView,并在创建时作为子视图添加到棋盘中.
我将游戏状态与对象中的视图属性完全分开,并且每个对象的状态在主游戏循环中更新(由NSTimer60-240 Hz 激发,具体取决于游戏速度设置).游戏完全可玩,无需绘制,更新或动画视图.
我使用CADisplayLink本机刷新率(60 Hz)的计时器处理视图更新,该计时器调用setNeedsDisplay需要根据游戏状态的变化更新其视图属性的板对象.电路板上的所有对象都覆盖drawRect:在其框架内绘制一些非常简单的2D形状.因此,例如,当一个武器被动画化时,它将根据武器的新状态重绘自己.
在iPhone 5上测试,在电路板上总共有大约24个游戏对象,帧速率显着下降到60 FPS(目标帧速率),通常在10-20 FPS范围内.随着屏幕上的更多动作,它从这里走下坡路.在iPhone 4上,情况更糟.
使用Instruments我已经确定只有大约5%的CPU时间用于实际更新游戏状态 - 其中绝大部分是用于渲染.具体来说,CGContextDrawPath函数(根据我的理解是矢量路径的光栅化完成的地方)占用了大量的CPU时间.有关详细信息,请参阅底部的"仪器"屏幕截图.
从对StackOverflow和其他网站的一些研究来看,似乎Core Graphics不能满足我的需求.显然,抚摸矢量路径非常昂贵(尤其是在绘制不透明且具有某些alpha值<1.0的东西时).我几乎可以肯定OpenGL可以解决我的问题,但它的水平相当低,而且我不是很高兴不得不使用它 - 看起来它不应该是我在这里所做的事情.
是否有任何优化我应该考虑尝试从Core Graphics获得平滑的60 FPS?
有人建议我考虑将所有对象都绘制成单个CALayer而不是单独使用每个对象CALayer,但我不相信这会有助于根据Instruments展示的内容.
就个人而言,我有一个理论,即使用CGAffineTransforms我的动画(即,drawRect:一次绘制对象的形状,然后转换以在后续帧中移动/旋转/调整其图层大小)将解决我的问题,因为这些直接基于OpenGL的.但我不认为这样做比直接使用OpenGL更容易.
为了让你感受到我正在做的绘画水平,这里是我的一个drawRect:武器对象(从塔发射的"光束")的实现示例.
注意:此光束可以"重新定位"并穿过整个电路板,因此为简单起见,其框架尺寸与电路板尺寸相同.但是,电路板上的大多数其他对象的框架设置为最小的外接矩形.
- (void)drawRect:(CGRect)rect
{
CGContextRef c = UIGraphicsGetCurrentContext();
// Draw beam
CGContextSetStrokeColorWithColor(c, [UIColor greenColor].CGColor);
CGContextSetLineWidth(c, self.width);
CGContextMoveToPoint(c, self.origin.x, self.origin.y);
CGPoint vector = [TDBoard …Run Code Online (Sandbox Code Playgroud) 
我想用Quartz 2D绘制文字."菜单"方向错误.我希望"菜单"仍然可读,并且与X轴有45度.以下是我的代码:
CGContextSelectFont(context, "Arial", 12, kCGEncodingMacRoman);
CGContextSetTextDrawingMode(context, kCGTextFill);
CGContextSetRGBFillColor(context, 0, 0, 0, 1); // 6
CGContextSetRGBStrokeColor(context, 0, 0, 0, 1);
CGContextSetTextMatrix(context, CGAffineTransformMake(1.0,0.0, 0.0, -1.0, 0.0, 0.0));
CGContextSetTextMatrix(context, CGAffineTransformMakeRotation(45));
CGContextShowTextAtPoint(context,10, 10, "Menu", 4);
Run Code Online (Sandbox Code Playgroud) 是)我有的:

要创建这一行,我基本上有一个UIView,我做以下事情:
void setLayerToLineFromAToB(CALayer *layer, CGPoint a, CGPoint b, CGFloat lineWidth)
{
CGPoint center = { 0.5 * (a.x + b.x), 0.5 * (a.y + b.y) };
CGFloat length = sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
CGFloat angle = atan2(a.y - b.y, a.x - b.x);
layer.position = center;
layer.bounds = (CGRect) { {0, 0}, { length + lineWidth, lineWidth } };
layer.transform = CATransform3DMakeRotation(angle, 0, 0, 1);
}
Run Code Online (Sandbox Code Playgroud)
注意:此代码在stackoverflow上找到,所以如果有人可以给我参考它,我将不胜感激. …
我想写使用一个简单的PDF查看器CGPDFDocument,基于QuartzDemo.
常见的渲染:
-(void)drawInContext:(CGContextRef)context
{
// PDF page drawing expects a Lower-Left coordinate system,
// so we flip the coordinate system before we start drawing.
CGContextTranslateCTM(context, 0.0, self.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
// Grab the first PDF page
CGPDFPageRef page = CGPDFDocumentGetPage(pdf, pageNumber);
// We're about to modify the context CTM to draw the PDF page
// where we want it, so save the graphics state
// in case we want to do more drawing
CGContextSaveGState(context);
// CGPDFPageGetDrawingTransform provides an …Run Code Online (Sandbox Code Playgroud) quartz-2d ×10
iphone ×7
ios ×6
cocoa-touch ×3
math ×2
pdf ×2
atan2 ×1
calayer ×1
cgcontext ×1
drawrect ×1
hyperlink ×1
objective-c ×1
performance ×1
uiimage ×1
uiview ×1