手绘与码绘对比——从画小人开始

手绘与码绘对比——从画小人开始

本文主要记录自己第一次以手绘作品为原型,用代码画画的过程以及体会。
一.手绘VS码绘

在这里插入图片描述
完成时长:10分钟
工具:钢笔,A4纸
效果:人物脸部的线条不匀称,线条不流畅,眼睛不够有神。
创作体验:整个过程完成很快,在画的过程中是很享受的,对笔的使用相比电脑来说很流利,但看到画完的效果会有点羞愧。

码绘作品
完成时长:8小时
工具:processing
效果:整个效果比手绘,线条流畅,人物表情也很生动,有色彩,不过额头上那条未消隐的线影响了整体的美观
创作体验:全过程很慢,而且很痛苦,由于所有的线条都是用Bezier曲线一条条加上去,然后一个个控制点修改的所以花的时间很多而且很痛苦,不过实现后很有成就感。

二.分析与总结
相同点:
在画图之前都要考虑身体比例大小,以及空间透视关系,如在这张图中人是侧着的,画之前是希望头比身子要大一点,所以在两幅图中都是能体现这些的,编程画图和手绘画图还有一个共同之处是,画的顺序大致一样,画头的时候先把脸的轮廓画出来,然后再画五官,画身体的时候也是先画左手然后是身体然后是右手。
不同点:
1.画头和手的顺序不同,编程画的图由于要考虑到后面填充的颜色会覆盖前面填充的颜色,因此先画头的话后面画的身体可能会遮住脸的部分,所以编程的时候是先执行画身体的代码,而在手绘的过程中就不会考虑到这些,是按照从上而下的顺序来画。
2.编程画图比手绘更精确一点,编程画画时需要确定圆心,曲线起始点的位置等等,这些都是通过事先计算加上根据效果调整得到的,而手绘的话主要就是根据感觉走,在下笔之前先确定大概轨迹,一旦手没有掌控很好的话,也不能做很大的调整,而在编程的时候,能够有一些控制点来控制曲线的走向如可以通过控制点控制贝赛尔曲线。
3.编程画画和手绘对设计者的要求不同,手绘时,我需要对画的内容仔细的观察,然后根据感觉以及经验来画,而在编程画画是,首先需要会编程,其次我需要告诉计算机要画的东西的具体坐标是什么,这就需要处理不同位置之间的关系,还有怎么控制曲线的走向,圆的大小等等。
4.编程画图的效果不是实时呈现的,当做了修改后要运行才能看到结果,而手绘的话调整后马上就能看到效果。

三.代码

void setup()
{
  size(500, 500);
  background(250);
}

void draw()
{
  drawBody();
  drawHead();
}


void drawHead()
{
  noStroke();
  noFill();
  fill(252, 224, 203);
  beginShape();
  vertex(187, 125);
  bezierVertex(165, 220, 311, 225, 323, 155);
  endShape();

  //head and hair

  noFill();
  noStroke();
  fill(10);
  noStroke();
  beginShape();
  vertex(187, 95);
  bezierVertex(200, 0, 335, 10, 333, 105);
  endShape();


  noFill();
  fill(252, 224, 203);
  noStroke();
  beginShape();
  vertex(187, 95);
  bezierVertex(200, 25, 315, 51, 333, 105);
  endShape();
  triangle(266, 43, 241, 65, 264, 63);
  triangle(307, 61, 304, 70, 310, 76);


  //ear
  beginShape();
  vertex(326, 108);
  bezierVertex(375, 101, 343, 174, 318, 153);
  endShape();

  /*stroke(0);
   strokeWeight(2);
   beginShape();
   vertex(322,135);
   bezierVertex(326,108,343,104,340,138);
   endShape();*/

  noStroke();
  quad(187, 95, 187, 125, 323, 155, 333, 105);


  //left radian
  fill(250);
  beginShape();
  vertex(187, 95);
  bezierVertex(191, 100, 197, 115, 187, 125);
  endShape();

  //left eye
  //noFill();
  //the outer
  ellipse(218, 115, 30, 38);

  fill(11);
  ellipse(218, 115, 20, 24);
  fill(255);
  ellipse(213, 115, 4, 4);
  ellipse(219, 110, 7, 7);

  //right eye

  ellipse(282, 118, 30, 38);

  fill(11);
  ellipse(282, 118, 20, 24);
  fill(255);
  ellipse(277, 118, 4, 4);
  ellipse(283, 113, 7, 7);

  //left eyebow
  fill(11);
  beginShape();
  vertex(203, 90);
  bezierVertex(205, 80, 230, 80, 233, 87);
  endShape();

  //right eyebow
  fill(11);
  beginShape();
  vertex(264, 90);
  bezierVertex(275, 80, 295, 89, 297, 97);
  endShape();

  //nose

  noFill();
  stroke(0);
  strokeWeight(2);
  beginShape();
  vertex(246, 136);
  bezierVertex(245, 145, 245, 146, 244, 144);
  bezierVertex(229, 134, 228, 156, 238, 160);
  endShape();

  //mouth
  beginShape();
  vertex(226, 170);
  bezierVertex(235, 185, 260, 189, 272, 174);
  //bezierVertex(229,134,228,156,238,160);
  endShape();

  //sheck
  noStroke();


  fill(247, 200, 207);
  ellipse(205, 147, 22, 18);

  ellipse(290, 153, 23, 18);
}



void drawBody()
{
  //body
  fill(247, 201, 60);

  triangle(272, 174, 212, 276, 334, 280);
  
  //fill(255,227,132);
  stroke(1);
  strokeWeight(1);
  beginShape();
  vertex(318, 230);
  bezierVertex(323, 238, 335, 278, 323, 280);
  endShape();
  
  
  beginShape();
  vertex(237, 264);
  bezierVertex(243, 285, 285, 278, 302, 250);
  endShape();
  noStroke();
  fill(255, 153, 18);
  triangle(239, 195, 216, 230, 239, 254);   //left arm
  triangle(305, 250,273,280,312,280);
  
  fill(255, 153, 18);
  stroke(1);
  strokeWeight(1);
  beginShape();
  vertex(305, 250);
  bezierVertex(307, 255, 305, 274, 312,280);
  endShape();
  
  fill(255, 227, 132);
  beginShape();
  vertex(227, 242);
  bezierVertex(217, 250, 225, 274, 230,279);
  endShape();
 fill(255, 153, 18);
  noStroke();
  
  quad(239, 195, 239, 254, 297, 238, 277, 195);
  quad(277, 195, 302, 250, 327, 230, 297, 174);

  stroke(1);
  strokeWeight(1);
  beginShape();
  vertex(216, 230);
  bezierVertex(217, 245, 236, 260, 239, 254);

  endShape();
  line(239, 195, 216, 232);
  line(239, 225, 237, 279);
  beginShape();
  vertex(239, 254);
  bezierVertex(243, 265, 276, 260, 297, 238);
  endShape();



  beginShape();
  vertex(302, 250);
  bezierVertex(315, 249, 326, 245, 327, 230);
  endShape();

  beginShape();
  vertex(297, 174);
  bezierVertex(305, 189, 316, 205, 327, 230);
  endShape();

  beginShape();
  vertex(285, 216);
  bezierVertex(288, 220, 305, 245, 302, 250);
  endShape();
}
内容概要:本文详细探讨了制造业工厂中两条交叉轨道(红色和紫色)上的自动导引车(AGV)调度问题。系统包含2辆红色轨道AGV和1辆紫色轨道AGV,它们需完成100个运输任务。文章首先介绍了AGV系统的背景和目标,即最小化所有任务的完成时间,同时考虑轨道方向性、冲突避免、安全间隔等约束条件。随后,文章展示了Python代码实现,涵盖了轨道网络建模、AGV初始化、任务调度核心逻辑、电池管理和模拟运行等多个方面。为了优化调度效果,文中还提出了冲突避免机制增强、精确轨道建模、充电策略优化以及综合调度算法等改进措施。最后,文章通过可视化结果分析,进一步验证了调度系统的有效性和可行性。 适合人群:具备一定编程基础和对自动化物流系统感兴趣的工程师、研究人员及学生。 使用场景及目标:①适用于制造业工厂中多AGV调度系统的开发优化;②帮助理解和实现复杂的AGV调度算法,提高任务完成效率和系统可靠性;③通过代码实例学习如何构建和优化AGV调度模型,掌握冲突避免、路径规划和电池管理等关键技术。 其他说明:此资源不仅提供了详细的代码实现和理论分析,还包括了可视化工具和性能评估方法,使读者能够在实践中更好地理解和应用AGV调度技术。此外,文章还强调了任务特征分析的重要性,并提出了基于任务特征的动态调度策略,以应对高峰时段和卸载站拥堵等情况。
内容概要:本文介绍了一个使用MATLAB编写的基于FDTD(时域有限差分)方法的电磁波在自由空间中传播的仿真系统。该系统采用了ABC(吸收边界条件)和正弦脉冲激励源,并附有详细的代码注释。文中首先介绍了关键参数的选择依据及其重要性,如空间步长(dx)和时间步长(dt),并解释了它们对算法稳定性和精度的影响。接着阐述了电场和磁场的初始化以及Yee网格的布局方式,强调了电场和磁场分量在网格中的交错排列。然后详细讲解了吸收边界的实现方法,指出其简单而有效的特性,并提醒了调整衰减系数时需要注意的问题。最后,描述了正弦脉冲激励源的设计思路,包括脉冲中心时间和宽度的选择,以及如何将高斯包络正弦振荡相结合以确保频带集中。此外,还展示了时间步进循环的具体步骤,说明了磁场和电场分量的更新顺序及其背后的物理意义。 适合人群:对电磁波传播模拟感兴趣的科研人员、高校学生及工程技术人员,尤其是那些希望深入了解FDTD方法及其具体实现的人群。 使用场景及目标:适用于教学演示、学术研究和技术开发等领域,旨在帮助使用者掌握FDTD方法的基本原理和实际应用,为后续深入研究打下坚实基础。 阅读建议:由于本文涉及较多的专业术语和技术细节,建议读者提前熟悉相关背景知识,如电磁理论、MATLAB编程等。同时,可以通过动手实践代码来加深理解和记忆。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值