Core Graphics : 弧线和轨迹

Moba中的弧线轨迹 子弹、人物绕某点弧线移动以及技能指示器绘制办法 三点定弧 上文圆心x,y作为指示器gameObject的子物体指示器的偏移按照上述伪代码给出的半径重新赋值即可。确定时 ,圆可确定,速度 加速度和位移时间只决定了圆的完整性 弧度对此圆的占比。人物位置确定 技能方向dir也是定制 在设计中位移半径也是定值,当。Moba游戏中一些情况需要用到弧线轨迹 例如lol中皎月的Q。圆弧轨迹实际是人物、子弹绕某点进行圆周运动,下面分享一种轨迹和指示器的制作思路。通过dir方向截取弧长绘制即可。,下篇博客我会给出自己的代码。y 加速度等同理 调试即可。 阅读详情

绘制弧线!Drawing Arcs, Oh My!


这是本教程系列的第三部分,讲解如何通过实例使用Core Graphics API!

在第一部分教程系列中,我们通过制作一个美观的tablie view cell 背景,讲解了如何绘制线,矩形和颜色渐变。

在第二部分教程系列中,我们通过制作一个美观的table view cell header,讲解了如何绘制阴影和光滑效果。

在本篇教程中,我们将通过为table view添加footer和结束触控事件来结束table view的制作。在教程中,我们也将学习绘制弧线,裁剪和轨迹的相关内容!

如果你还没有本教程的例子代码, 可以在这里下载上篇教程的代码。

开始

我们首先要做的,是用15像素点高的红色view去替换掉footer – 就像前面的教程那样做 – 以确保一切运作正常。

到现在,你应该相当熟悉如何操作了… 那为何不自己做一遍呢?如果遇到什么问题,你都可以随时回到这里。
…

…等待…

…

…等待…

…

…等待…
…

 

Tomato-San is angry!

Tomato-San 生气了!

 

 

什么?!你现在还在这里发呆?!你可以做到的 – 继续尝试下吧!:]

解决方案

假如你遇到任何麻烦,以下是解决方案。

确保你的 “Groups & Files”下面的“Classes”分组被选中,前往菜单项的 “FileNew File…”,选择iOSCocoa Touch Class,Objective-C class,确保”Subclass of UIView”被选中,然后点击下一步。命名文件为”CustomFooter.m”,确保”Also create CustomFooter.h”被选中,然后点击”Finish”。

切换到CustomFooter.m文件,取消drawRect方法的注释,然后使用以下代码替换掉原来的内容:

CGContextRef context = UIGraphicsGetCurrentContext();
CGColorRef redColor = [UIColor colorWithRed:1.0 green:0.0 
    blue:0.0 alpha:1.0].CGColor;
 
CGContextSetFillColorWithColor(context, redColor);
CGContextFillRect(context, self.bounds);

然后切换到RootViewController.m文件,根据以下代码做修改:

// In import section

#import "CustomFooter.h"
// Add new methods
-(CGFloat) tableView:(UITableView *)tableView 
    heightForFooterInSection:(NSInteger)section {
    return 15;
}
- (UIView *) tableView:(UITableView *)tableView 
    viewForFooterInSection:(NSInteger)section {
    return [[[CustomFooter alloc] init] autorelease];
}

 

编译并运行工程,如果一切运行正常,你将看到以下画面:

Table View Footer Placeholder

回到正题

 

既然现在我们在当前区域有一个预留的view,我们对它美化下吧。首先,先为接下来的操作刷新内存。

Zoomed image of Table View Footer

注意以下对上图效果的描述:

  • 页面底部有一条匀整的弧线。
  • 页面有从浅灰色到深灰色的渐变效果。
  • 在页面的左右边缘还有种白色的高亮显示效果。
  • 页面的弧线下部有一块合适的阴影效果。

显然这里的新效果就是弧线。让我们对它做一点讨论。

创建弧线 – 数学问题

 

从示意图可以看出,我们想要的弧线只是一块有很大半径,从特定的开始角度到特定的结束角度的大圆顶部。

Diagram of the circle that our arc is part of

那现在我们如何用Core Graphics去描述这段弧线呢?好的,我们将要使用的API是CGContextAddArc API,作为这个函数的输入参数,我们需要告诉Core Graphics以下三项内容:

  1. 圆的中心点
  2. 圆的半径
  3. 绘制弧线的开始点和结束点

但遗憾的是我们并不知道这些内容,那我们能做什么呢?!

这里就需要一些简单的数学原理了。我们可以根据已经知道的计算出所需要的参数!

首先我们知道想要绘制弧线的方框的尺寸大小:
Diagram of the rectangle in which our arc will be drawn

其次我们知道一个有趣的数学定理,叫做相交弦定理, 该定理说如果你想要在一个圆中,绘制任意两条连接圆上两个点的线(这些线称为弦),两条弦的分段线段长度乘积相等。

Diagram of the Intersecting Chord Theorem

如果你想要理解这个原理,可以进入上面的网络链接,该链接里面有一个很酷的小javascript demo提供给你玩下。

有了以上两项已知条件,看看如果我们像下面那样绘制两条弦会发生什么:

Diagram of the lines we'll draw to figure out the radius...

这里我们绘制了一条线,连接我们的弧线方框底部的两个点,另外还绘制了一条连接弧线方框顶部和圆底部的线。

如果我们这样做,已知a,b和c,就可以计算出d了。

所以d就是 (a * b) / c。用代码表示出来就是:

// Just substituting...
CGFloat d = ((arcRectWidth/2) * (arcRectWidth/2)) / (arcRectHeight);
// Or more simply...
CGFloat d = pow(arcRectWidth, 2)/(4*arcRectHeight);

现在我们知道了c和d,我们知道半径就是他们的和的一半(c + d) / 2!用代码表述如下:

// Just substituting...
CGFloat radius = (arcRectHeight + (pow(arcRectWidth, 2)/(4*arcRectHeight)))/2;
// Or more simply...
CGFloat radius = (arcRectHeight/2) + (pow(arcRectWidth, 2)/(8*arcRectHeight));

很好!现在我们知道了半径,很容易就可以知道圆心了 – 用阴影矩形的中心点的Y坐标值减去半径。

CGPoint arcCenter = CGPointMake(arcRectTopMiddleX, arcRectTopMiddleY - radius);

一旦我们知道了中心点,半径和弧线方框,很容易就可以计算出弧线的开始和结束角度了:

Diagram of how to figure out the start and end angle for an arc from the radius...

现在我们可以从计算图示的角度值开始。还记得三角函数吗?角度的cos值等于三角形中与角相邻的直角边长度除以斜边长度。

用另一种方式表述,就是 cosine(angle) = (arcRectWidth/2) / radius。所以要获得角度,我们可以使用arccos函数:

CGFloat angle = acos(arcRectWidth/(2*radius));

既然我们知道了角度,很容易就获得开始和结束的角度值了:

Diagram of how to figure out the start and end angles...

很好!既然我们知道了所有的原理,让我们写在函数里面吧。

另外,值得一提的是 – 有一种更容易的,像这样使用CGContextAddArcToPoint函数去绘制弧线的方法。我们将会在下一篇教程系列中讨论它,但是我觉得很有必要讲解下上面所述方法的相关数学原理。

绘制弧线和创建轨迹

打开Common.h文件,添加以下代码到文件的底部:

static inline double radians (double degrees) { return degrees * M_PI/180; }
CGMutablePathRef createArcPathFromBottomOfRect(CGRect rect, CGFloat arcHeight);

我们首先要添加的是一个转换度数值为弧度值的辅助函数。

然后…等会…什么叫 CGMutablePathRef?

还记得使用Core Graphics绘制图形需要两个步骤。首先你要定义轨迹,然后画轨迹或者给轨迹填充颜色。

到现在为止,我们只是简单的使用CGContextMoveToPoint, CGContextAddLineToPoint 和 CGContextAddRect等函数直接在context上绘制想要的轨迹 ,然后使用CGContextStrokePath 或者 CGContextFillPath函数去给轨迹绘制或者填充颜色。

有时候,我们也会用简便的方法,在context上添加一段轨迹并且调用一个函数,比如CGContextFillRect,给它填充颜色。

但是现在,我们将保存一段轨迹到一个特定的path变量中,而不是直接把轨迹添加到context上面。这样可以很容易的重用定义好的轨迹path,而不需要反复的去调用同一个函数。

绘制可重用的轨迹相当的容易 – 你只需要调用CGPathXXX 类型函数,而不是 CGContextXXX类型函数。

让我们看下它的工作原理。添加以下代码到Common.m文件的底部:

CGMutablePathRef createArcPathFromBottomOfRect(CGRect rect, CGFloat arcHeight) {
 
    CGRect arcRect = CGRectMake(rect.origin.x, 
        rect.origin.y + rect.size.height - arcHeight, 
        rect.size.width, arcHeight);
 
    CGFloat arcRadius = (arcRect.size.height/2) + 
        (pow(arcRect.size.width, 2) / (8*arcRect.size.height));
    CGPoint arcCenter = CGPointMake(arcRect.origin.x + arcRect.size.width/2, 
        arcRect.origin.y + arcRadius);
 
    CGFloat angle = acos(arcRect.size.width / (2*arcRadius));
    CGFloat startAngle = radians(180) + angle;
    CGFloat endAngle = radians(360) - angle;
 
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddArc(path, NULL, arcCenter.x, arcCenter.y, arcRadius, 
        startAngle, endAngle, 0);
    CGPathAddLineToPoint(path, NULL, CGRectGetMaxX(rect), CGRectGetMinY(rect));
    CGPathAddLineToPoint(path, NULL, CGRectGetMinX(rect), CGRectGetMinY(rect));
    CGPathAddLineToPoint(path, NULL, CGRectGetMinX(rect), CGRectGetMaxY(rect));
    return path;    
 
}

好的,这个函数需要输入整个区域的矩形变量和一个定义弧线有多大的浮点数值(这段弧线位于矩形的底部)。然后根据这两个参数去计算弧线矩形。

然后我们利用上面提到的数学方法,计算出半径,圆心,开始和结束的角度值。

接下来,我们创建轨迹。轨迹将包括弧线,还有包围弧线上面的矩形区域的边界线。

首先我们使用CGPathCreateMutable函数创建可重用的轨迹变量。然后我们使用CGPathXXX类型函数,而不是CGContextXXX类型函数。

我们使用CGPathAddArc函数去添加我们的弧线,传入已经计算出来的所有数值参数,然后从每个端点绘制线段以完成轨迹。

使用以下代码,对CustomFooter.m文件进行修改:

// At top of file

#import "Common.h"
// Inside initWithFrame
self.opaque = YES;
self.backgroundColor = [UIColor clearColor];
// Replace the contents of drawRect with the following:
CGContextRef context = UIGraphicsGetCurrentContext();
CGColorRef whiteColor = [UIColor colorWithRed:1.0 green:1.0 
    blue:1.0 alpha:1.0].CGColor; 
CGColorRef lightGrayColor = [UIColor colorWithRed:230.0/255.0 green:230.0/255.0 
    blue:230.0/255.0 alpha:1.0].CGColor;
CGColorRef darkGrayColor = [UIColor colorWithRed:187.0/255.0 green:187.0/255.0 
    blue:187.0/255.0 alpha:1.0].CGColor;
CGColorRef shadowColor = [UIColor colorWithRed:0.2 green:0.2 
    blue:0.2 alpha:0.5].CGColor;
CGFloat paperMargin = 9.0;
CGRect paperRect = CGRectMake(self.bounds.origin.x+paperMargin, 
                        self.bounds.origin.y,
                        self.bounds.size.width-paperMargin*2, 
                        self.bounds.size.height);
CGRect arcRect = paperRect;
arcRect.size.height = 8;
CGContextSaveGState(context);
CGMutablePathRef arcPath = createArcPathFromBottomOfRect(arcRect, 4.0);
CGContextAddPath(context, arcPath);
CGContextClip(context);            
drawLinearGradient(context, paperRect, lightGrayColor, darkGrayColor);
CGContextRestoreGState(context);
CFRelease(arcPath);

好的,我们这里首先设置view为opaque(非透明),并且使用默认的clearColor作为背景颜色。

注意到我们实际上可以在initWithFrame方法中进行这些设置,然后即使当我们在RootViewController中调用“init”方法时,这些代码也会被调用。

更新:来自评论部分的edj解释了相关原因:

“Cocoa convention表示,有一个指定的初始化函数(通常是最完整的一个),会被类里面的其他任何一个init方法调用。所以 – init方法替你调用了 – initWithFrame方法。”

接下来我们进行Core Graphics的基本设置(context,颜色)以及为整个页面区域创建一个矩形方框(记住,我们需要做些缩进调整)还有我们希望弧形所在的区域(矩形的顶部,在弧形下面有一些阴影或者黑色间隔)。

然后,我们通过调用刚才定义的createArcPathFromBottomOfRect方法,获得页面的轨迹(还有底部的弧线)。然后可以添加轨迹到context上,并且裁剪到那个轨迹上。

接下来所有的绘制都会限定在这个轨迹上面。我们可以使用之前定义好的drawLinearGradient方法!

最后,当我们完成绘制工作的时候,使用CFRelease函数释放掉path变量。

编译运行工程,如果一切运行正常,你将看到以下画面:

Table Footer, First Draft

看起来不错,但是我们需要进一步修饰下它。

修剪,轨迹,还有Even-Odd规则

接下来添加以下代码到drawRect函数的底部(但是要在CFRelease方法调用之前):

CGContextSaveGState(context);
CGPoint pointA = CGPointMake(arcRect.origin.x, 
    arcRect.origin.y + arcRect.size.height - 1);
CGPoint pointB = CGPointMake(arcRect.origin.x, arcRect.origin.y);
CGPoint pointC = CGPointMake(arcRect.origin.x + arcRect.size.width - 1, 
    arcRect.origin.y);
CGPoint pointD = CGPointMake(arcRect.origin.x + arcRect.size.width - 1, 
    arcRect.origin.y + arcRect.size.height - 1);
draw1PxStroke(context, pointA, pointB, whiteColor);
draw1PxStroke(context, pointC, pointD, whiteColor);    
CGContextRestoreGState(context);

这里我们在footer的每条边界上绘制了一条粗白线,让它突出来一点。基于之前的教程,你应该相当的熟悉了。

你可以编译运行看下是不是你想要的效果。当你准备好的时候,将以下代码添加到你刚才在弧线下部绘制阴影的代码下面:

CGContextAddRect(context, paperRect);
CGContextAddPath(context, arcPath);
CGContextEOClip(context);
CGContextAddPath(context, arcPath);
CGContextSetShadowWithColor(context, CGSizeMake(0, 2), 3.0, shadowColor);
CGContextFillPath(context);

这里出现了一个新的关键概念,我解释下。

记得在上篇教程中绘制阴影,你进行了阴影绘制,然后绘制了轨迹。Core Graphics会自动绘制上轨迹,然后在轨迹下面画上恰当的阴影。

但是这里,我们已经用颜色渐变绘制了轨迹 – 所以我们不希望再用颜色去覆盖那个区域。

这似乎像是裁剪的工作!我们可以设置好clipping以便Core Graphics只在页面区域的外围部分进行绘制。然后我们可以让它去填充页面区域并且绘制阴影了,页面的填充就会被忽略(因为它是裁剪),但是阴影还会显现出来。

但是我们还没有轨迹 – 目前我们有的轨迹只是给页面区域的,外围部分的就没有…

幸运的是,我们可以简单的通过内部区域获取外部区域的轨迹,通过Core Graphics的简单方法。你需要做的就是添加不止一个轨迹到context上,然后调用“CGContextEOClip”方法。

当你添加不止一条轨迹到context上时,Core Graphics 需要一些方法去决定哪个点应该被填充,哪个又不用。例如,你可以甜甜圈形状,它的外部被填充了,但是内部却是空的,或者一个甜甜圈洞形状,它的内部被填充了,但是外部却没有。

你可以制定不同的算法,让Core Data知道如何去处理这些情况。其中一种算法是“EO”,或者even-odd。它表示对任何一个点,Core graphics将会绘制一条连接那个点到绘制区域外部的线。如果这条线穿过偶数值点,它就会被填充,反之不会。以下来自Quartz2D Programming Guide的图示展示了这个原理:

Even Odd Rule Diagram

当你使用“EO”规则时候,我们告诉Core Graphics,即使添加了两条轨迹到context上,根据EO规则,仍应该只把它当做一条轨迹。所以外围部分(整个paperRect)会被填充,内部(arcPath)就不会被填充了。

然后我们让Core Graphics去裁剪那段轨迹,仅仅在外部区域绘制。

一旦我们裁剪好后,我们会为弧线添加轨迹,设置好阴影,并且填充弧线。当然,没有东西会被填充(因为它被裁剪掉了),但是阴影仍然会被绘制在外部区域!

编译运行工程,如果一切运行正常,你将看到footer下面的阴影了:
Table Footer With Shadows

收尾工作

我们的table view现在看起来相当不错了,但是让我们再花点时间做些收尾工作吧。

首先,修复最坏的部分:最后的table view cell 真不该绘制分隔线,让人觉得奇怪。另外,table view cell选取和被选取时没有什么区别,文本的颜色也变成了难看的白色。所以根据以下代码,对CustomCellBackground.h文件做出修改:

// Inside @interface
BOOL _lastCell;
BOOL _selected;
// After @interface
@property  BOOL lastCell;
@property  BOOL selected;

同理根据以下代码,修改CustomCellBackground.m文件:

// After @implementation
@synthesize lastCell = _lastCell;
@synthesize selected = _selected;
// Replace first call to drawLinearGradient with the following:
if (_selected) {
    drawLinearGradient(context, paperRect, lightGrayColor, separatorColor);
} else {
    drawLinearGradient(context, paperRect, whiteColor, lightGrayColor);
}
// Wrap the rest of the code with the following
if (!_lastCell) {
    // Code drawing 1 px stroke and separator
}
// Then add the following
else {
 
    CGContextSetStrokeColorWithColor(context, whiteColor);
    CGContextSetLineWidth(context, 1.0);
 
    CGPoint pointA = CGPointMake(paperRect.origin.x, 
        paperRect.origin.y + paperRect.size.height - 1);
    CGPoint pointB = CGPointMake(paperRect.origin.x, paperRect.origin.y);
    CGPoint pointC = CGPointMake(paperRect.origin.x + paperRect.size.width - 1, 
        paperRect.origin.y);
    CGPoint pointD = CGPointMake(paperRect.origin.x + paperRect.size.width - 1, 
        paperRect.origin.y + paperRect.size.height - 1);
 
    draw1PxStroke(context, pointA, pointB, whiteColor);
    draw1PxStroke(context, pointB, pointC, whiteColor);
    draw1PxStroke(context, pointC, pointD, whiteColor);
 
}
对上面的代码,你现在应该相当熟悉了。最后根据以下代码对RootViewController.m文件进行修改:
// Inside tableView:cellForRowAtIndexPath, inside cell == nil case:
((CustomCellBackground *)cell.selectedBackgroundView).selected = YES;
// After creating cell, inside indexPath.section == 0 case:
((CustomCellBackground *)cell.backgroundView).lastCell = 
        indexPath.row == _thingsToLearn.count - 1;
((CustomCellBackground *)cell.selectedBackgroundView).lastCell = 
        indexPath.row == _thingsToLearn.count - 1;
// After creating cell, else case:
((CustomCellBackground *)cell.backgroundView).lastCell = 
        indexPath.row == _thingsLearned.count - 1;
((CustomCellBackground *)cell.selectedBackgroundView).lastCell = 
        indexPath.row == _thingsLearned.count - 1;
// At the end, before return cell:
cell.textLabel.highlightedTextColor = [UIColor blackColor];
编译运行工程,你将看到table view变得更美观了:

Table View Finishing Touches

然后,让我们设置下背景和navigation bar,让它们看起来更美观。打开MainWindow.xib文件,展开Navigation Controller,然后点击 Navigation Bar。在Attributes Inspector中,改变Tint颜色为一种更好看的深色,如下所示:

Setting the tint color in a navigation bar

接下来,双击Window,拖动UIImageView控件到window上面,让它填充整个空间。使用你喜欢的图片对UIImageView进行image设置,或者你可以下载来自sxc.hu的jaylopez 制作的图片。

最后我们需要做的是取消table view的默认背景,这样我们的图片就可以看到了。打开 RootViewController.xib文件,选取Table View,修改View section下面Background选项为clear background color:

Removing the striped grouped table view background color

保存XIB文件,编译运行工程,如果一切运行正常,你将看到以下画面:

Finished custom drawn table view

就是这样!一个完整的使用Core Graphics绘制的个性化table view!

现在还可以做什么?

这是本教程开发的例子代码,你可以在这里下载!

现在你应该可以使用Core Graphics去做一些很酷的东西了!但是如果你感兴趣,还有更多的东西提供给你学习 – 看下这篇使用Core Graphics创建光滑按钮的教程,或者这篇使用Core Graphics创建图案的教程!


creator 使用Graphics绘制移动的虚线 项目 creator 使用Graphics绘制移动的虚线 立即下载

相关推荐

生成对抗网络(GAN、DCGAN、ACGAN)-----学习笔记

生成对抗网络学习笔记 生成对抗网络有两个关键结构:生成模型、判别模型。 生成模型:输入是一个服从正态分布的N维向量,利用这个N维向量生成一张图片。 判别模型:对于生成模型输出的图像判别它是不是真的图像。 生成模型和判别模型的博弈关系在于:生成模型的目的是生成让判别模型无法判别真伪的图像,而判别模型的目的是判断输入图像的真伪。 结合代码来看生成对抗网络中,生成器和判别器的训练过程: 判别模型的训...

weixin_43227526的博客 5490

Swift-Core Graphics绘图框架详解3(绘制渐变、填充渐变色)

Quartz 2D 的渐变方式分为如下两种: 线性渐变:渐变色以直线方式从开始位置逐渐向结束位置渐变放射性渐变:以中心点为圆心从起始渐变色向四周辐射,直到终止渐变色 使用中我们可以直接绘制一个渐变,也可以将渐变填充到现有的图形路径上。下面通过样例分别进行演示。 一、渐变的绘制  1,绘制线性渐变 import UIKit  

雨夜枫起的博客 2842

保姆级教程:用Smaart7和你的USB声卡搞定现场音响系统调试(附频谱与延时测试避坑指南)

本文提供Smaart7与USB声卡协同工作的现场音响系统调试指南,涵盖硬件连接、频谱分析、延时校准等关键步骤。通过详细的操作流程和常见问题解决方案,帮助音响工程师快速掌握专业测量技术,确保演出音质达到最佳状态。

weixin_29290259的博客 424

Drawing Gradients(绘制渐变)

绘制过程:     创建上下文环境 -CGContextRef  UIGraphicsGetCurrentContext (void); //CGContextRef currentContext = UIGraphicsGetCurrentContext();     保存状态 -void  CGContextSaveGState (CGContextRef c);  // CGContex

berained的专栏 1538

c语言版数据结构课程设计 学生成绩管理系统

此学生成绩管理系统完成15项功能,是我经过很多次的修改得到的。花费时间不短,功能齐全,主要完成了:输入,输出,插入,修改,删除,查询,读取文件,写入文件,复制文件,建立索引,显示各种情况下的信息,追加学生信息等等功能。一共15项。   代码如下: // shujujiegou.cpp : 定义控制台应用程序的入口点。///**本程序采用数组链表形式,原因:数组查询速度快,数组也能实现动态存储

Java 1万+

【有啥问啥】智能座舱CPD技术:毫米波雷达如何守护儿童安全?

本文深入探讨了智能座舱中CPD(Child Presence Detection)技术如何通过毫米波雷达保障儿童安全。毫米波雷达凭借其穿透性检测、微动感知等优势,成为儿童遗留车内的有效解决方案。文章详细解析了技术原理、系统集成方案及安装指南,为智能座舱安全技术提供了实用参考。

weixin_29193259的博客 358

关于着色器LinearGradient的使用

LinearGradient我们可以将之译为线型渐变、线型渲染等,译成什么不重要,重要的是它的显示效果是什么样子,今天我们就一起来看看。先来看看LinearGradient的构造方法: /** Create a shader that draws a linear gradient along a line. @param x0 The x-coord...

weixin_30273501的博客 701

TSC条码打印机C#例程(tsclib.dll调用) 【转】

//----program.cs using System;using System.Collections.Generic;using System.Windows.Forms; using System.Runtime.InteropServices;public class TSCLIB_DLL{[DllImport("TSCLIB.dll", EntryPoint = "abou...

weixin_33843947的博客 2441

cocosCreator 之 Graphics绘制基础图形,五角星,线型图,柱形图

Grphics绘制五角星、柱形图等

鹤九日的博客 5496

【专栏导引贴】100+智能优化算法:从背景原理到代码实战(持续更新)

本专栏系统整理100+种现代优化算法,涵盖粒子群优化(PSO)、遗传算法(GA)、鲸鱼优化(WOA)等经典方法,以及白鲸优化(BWO)、非洲秃鹫优化(AVOA)等新兴算法。每篇详解包含生物启发原理、数学模型、代码实现及工程应用,采用统一编程风格,提供可直接运行的实例代码。专栏持续更新,旨在为研究者提供系统化的智能优化算法参考资料,实现从理论到实践的完整知识链。目前已收录23种算法,包括蚁群系统(ACS)、蝙蝠算法(BA)、天牛须搜索(BAS)等自然启发式优化方法。

qq_42212808的博客 3654

科研牛马千万不要错过!手把手教你用AI精准匹配真实参考文献,仅需一个专业应用+两个提示词指令

当然也可以借助生成式AI,如GPT-5.2、Gemini 3 Pro粘贴段落,输入设计好的提示词,让模型根据段落内容匹配参考文献,并正确引用到段落合适位置,再按规范格式输出参考文献列表。阅读我提供的【正文文本】,为其中的关键论点寻找真实的、权威的参考文献(优先来源于Nature, Science, IEEE, ACM, PubMed等),并插入引用。若在段落中已经引用好了参考文献,也有参考文献列表,担心引用位置不当或论点、论述逻辑与文献不够契合,则可以用以下结构化提示词,让AI辅助审查。

智能AI让学术科研更容易 1032

Core Graphics 101: 弧线和轨迹

这是本教程系列的第三部分,讲解如何通过实例使用Core Graphics API! 在第一部分教程系列中,我们通过制作一个美观的tablie view cell 背景,讲解了如何绘制线,矩形和颜色渐变。 在第二部分教程系列中,我们通过制作一个美观的table view cell header,讲解了如何绘制阴影和光滑效果。 在本篇教程中,我们将通过为table view添加foo

qtcreatorlinux的专栏 1215

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

iOS UIView的drawRect方法 - setNeedsDisplay和setNeedsDisplayInRect.

转载:http://blog.youkuaiyun.com/liliangchw/article/details/8448381 有了view的子类,只要重载一个方法drawRect -(void)drawRect:(CGRect)aRect; 它的参数是个矩形,这个矩形就是你要重绘的区域,你可以忽略参数,它只是为了性能优化,只在固定的区域绘图. 注意!!! 永远不要去调用drawRect,因为d

xuejunrong的博客 3675

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

UIBezierPath + CAShapeLayer的简单使用

先看看UIBezierPath的基础概念 UIBezierPath是CGPathRef数据类型的封装。使用UIBezierPath可以创建基于矢量的路径,此类是Core Graphics框架关于路径的封装。使用此类可以定义简单的形状,如椭圆、矩形或者有多个直线和曲线段组成的形状等所以在这里我想到的是用UIBezierPath进行绘图实现.h(先引入QuartzCore/QuartzCore

Raymon、浅忆。 726

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

揭秘 Tactile VirtualCursor 虚拟光标:让 AI Agent 的后台操作被看见的渲染原理

**Tactile 是一个面向 AI Agent 的可访问性优先操作系统层**,其中的 VirtualCursor 虚拟光标模块,把 Agent 在后台执行的每一次点击、移动"可视化"到你的屏幕上——你不再需要盯着终端日志猜测 Agent 正在干什么,屏幕上会出现一个带拖尾、会"呼吸"、点击时泛起涟漪的彩色光标,实时展示 Agent 的每一步动作。 ## 为什么需要"被看见"的 AI 操作?

gitblog_01159的博客 733

ios绘图系列五:绘制渐变CGContextDrawLinearGradient, CGContextDrawRadialGradient, CAGradientLayer

iOS Core Graphics 的渐变可以分成径向渐变和辐射渐变.可以实现如下的图形: 可以在view 的 - (void)drawRect:(CGRect)rect实现 CGContextRef ctx = UIGraphicsGetCurrentContext(); //创建一个RGB的颜色空间 CGColorSpaceRef rgb = CG

lcl130的专栏 8608

Graphics 框架画各种图形(圆、三角形、扇形、弧线、圆角矩形等等)

Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎。它提供了低级别、轻量级、高保真度的2D渲染。该框架可以用于基于路径的绘图、变换、颜色管理、脱屏渲染,模板、渐变、遮蔽、图像数据管理、图像的创建、遮罩以及PDF文档的创建、显示和分析。 iOS支持两套图形API族:Core Graphics/QuartZ 2D 和OpenGL ES。OpenGL

图解AI 2万+

button渐变色 ios_总结iOS实现渐变颜色的三种方法

在iOS开发过程中有的时候会需要用到渐变的颜色,这篇文章总结了三种方法来实现,有需要的朋友们下面来一起看看吧。一、CAGradientLayer实现渐变CAGradientLayer是CALayer的一个特殊子类,用于生成颜色渐变的图层,使用较为方便下面介绍下它的相关属性:colors 渐变的颜色locations 渐变颜色的分割点startPoint&endPoint 颜色渐变的方向,范...

weixin_39847556的博客 673

Android 颜色渲染(五) LinearGradient线性渲染

Android 颜色处理(五) LinearGradient线性渲染 相信很多人都看过歌词同步的效果, 一是竖直方向的滚动,另一方面是水平方面的歌词颜色渐变点亮效果,这种效果怎么做呢? 这就需要用到LinearGradient线性渲染,下面还是先看具体的使用: LinearGradient有两个构造函数; public LinearGradient(float x0, float y0,...

844604778 888

线性渐变LinearGradient的使用

如下图所示是产品设计出来的自定义view,风险等级的;其中的一部分就是中间的那个渐变的bar;这里就讲解下LinearGradient整个自定义view可以拆分成几部分: 绘制: - 中间的条形bar - 上下的刻度线和刻度值 - 下面的圆圈 - 滑块 - 左下角和右下角的文字(整个可以忽略) 事件: - 滑块的滚动 - 刻度值的放大 - 滑块的矫正(只能滑到刻度

倒骑驴走着瞧的博客 9113

Quartz2D实现渐变色

最开始渐变色这里直接给UI要的一张图放在了上面,后来有时间就研究了一下Quartz2D。  在iOS中常用的绘图框架就是Quartz2D, Quartz2D是CoreGraphics框架的一部分, 强大的二维图像绘制引擎, Quartz2D在UIKit框架中也有很好的集成, UIKit中的组件都是由     CoreGraphics进行绘制的,     iOS中绘图一般分为以下几个步骤:

H个MJ的博客 1074

ios CGContext 学习1 画线 画矩形 渐变效果

void drawLinearGradient(CGContextRef context, CGRect rect, CGColorRef startColor, CGColorRef endColor) { CGColorSpaceRe...

weixin_33853827的博客 321

Android绘图之LinearGradient线性渐变(9)

linearGradient简介 linearGradient线性渐变,会用到Paint的setShader,Shader 被称为着色器,在opengl中这个概念经常被用到,android中的shader主要用来给图像着色,Shader在绘制过程中会返回横向重要的颜色组,Paint设置shader后,绘制时会从shader中获取颜色,也就是需要shader告诉画笔某处的颜色值。 Shader 具体...

lidongxiu0714 4万+

线性渐变LinearGradient使用总结

Android 支持三种颜色渐变, LinearGradient(线性渐变)、 RadialGradient (径向渐变)、 SweepGradient(扫描渐变)。这三种渐变均继承自android.graphics.Shader, Paint 类通过setShader()方法来支持渐变。 这篇文章先总结LinearGradient的使用, RadialGradient (径向渐变)、 Sweep...

sqf251877543的博客 3万+
上一篇: Core Graphics : 线,矩形和渐变效果
下一篇: 光滑的UIButton
Vjsplus
博客等级 码龄13年 1粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值