Math 在加工过程中创建锯片形状

Math 在加工过程中创建锯片形状,math,geometry,processing,bezier,curve,Math,Geometry,Processing,Bezier,Curve,我正在尝试使用处理重新创建此图像。如何制作红色锯片 我的思维过程是,假设图像在几个轴上是对称的,那么就把它分解。我在和“红色锯片”搏斗。看起来我必须使用贝塞尔曲线来创建线条,然后填充它们。如果我能够创建一个鳍,那么我可以在轴上旋转它的一个副本来旋转它 只需使用贝塞尔曲线的控制点即可提供所需的形状 这是Delphi中快速生成的示例 点P0-P3表示齿的第一面(凹面),点P3-P6表示齿的第二面 Rin和ROut是saw的内外半径,RM是用于控制点计算的中间半径 内环an是一个齿的底角,an1略微

我正在尝试使用处理重新创建此图像。如何制作红色锯片


我的思维过程是,假设图像在几个轴上是对称的,那么就把它分解。我在和“红色锯片”搏斗。看起来我必须使用贝塞尔曲线来创建线条,然后填充它们。如果我能够创建一个鳍,那么我可以在轴上旋转它的一个副本来旋转它

只需使用贝塞尔曲线的控制点即可提供所需的形状

这是Delphi中快速生成的示例

点P0-P3表示齿的第一面(凹面),点P3-P6表示齿的第二面

Rin和ROut是saw的内外半径,RM是用于控制点计算的中间半径

内环
an
是一个齿的底角,
an1
略微偏移以提供凹弧的曲率,
an2
是结束角(与下一个齿的底角相同),
an3
是凸弧控制点的中间角


只需使用贝塞尔曲线的控制点即可提供所需的形状

这是Delphi中快速生成的示例

点P0-P3表示齿的第一面(凹面),点P3-P6表示齿的第二面

Rin和ROut是saw的内外半径,RM是用于控制点计算的中间半径

内环
an
是一个齿的底角,
an1
略微偏移以提供凹弧的曲率,
an2
是结束角(与下一个齿的底角相同),
an3
是凸弧控制点的中间角


这是一张很小的照片。放大它,然后将其加载到绘制贝塞尔曲线的工具中。您知道三个固定坐标(圆和尖端的两个坐标)以及控制点所需的一般切线:

您还知道,控制点和曲线上的点需要形成一个包围实际曲线的框(例如,曲线不能超出该框),作为Bezier曲线的属性

所以现在:你在寻找正确的分数。您可以使用Inkscape、Photoshop或Illustrator之类的工具来查看哪条曲线看起来足够好,然后将坐标复制到您自己的程序中,或者您只需在网格上绘制坐标,通过查看网格找到粗略坐标,然后在您认为的位置附近使用值

然后,如果缺少控制点,则在处理过程中将其绘制为形状:

void draw() {
  // draw the inner circle with a "fat" stroke
  strokeWeight(20);
  // assuming center mode
  ellipse(width/2, height/2, 100, 100);

  // reset that stroke fatness
  strokeWeight(1);
  // make sure we'll be rotating about the center of the sketch
  translate(width/2, height/2);
  // and then start drawing eight 'teeth'
  for (int i=0; i<8; i++) {
    beginShape();
    // we know where p1, p2, and p3 are.
    vertex(p1.x, p1.y);
    // and we "guessed" at c1, c2, c3, and c4.
    bezierVertex(c1.x, c1.y, c2.y, c2.y, p2.x, p2.y);
    bezierVertex(c3.x, c3.y, c4.y, c4.y, p3.x, p3.y);
    // We leave the shape "open" in case you want both stroke and fill
    endShape();
    // we're drawing eight teeth, so we need to rotate by 2*PI/8 each time
    rotate(0.25 * PI);
  }
}
void draw(){
//用“胖”笔划画出内圈
冲程重量(20);
//假设中心模式
椭圆(宽/2,高/21000);
//重置中风肥胖
冲程重量(1);
//确保我们将围绕草图的中心旋转
平移(宽度/2,高度/2);
//然后开始画八颗“牙齿”

对于(int i=0;i这是一张很小的图片。放大它,然后将其加载到用于绘制贝塞尔曲线的工具中。您知道三个固定坐标(圆上的两个坐标和尖端),并且知道控制点需要沿着的一般切线:

您还知道,控制点和曲线上的点需要形成一个包围实际曲线的框(例如,曲线不能超出该框),作为Bezier曲线的属性

所以现在:你可以用Inkscape、Photoshop或Illustrator之类的工具看看哪条曲线看起来足够好,然后把坐标复制到你自己的程序中,或者你只需在网格上画出来,通过查看网格找到粗略的坐标,然后用数值进行游戏It’离你想的地方很近

然后,如果缺少控制点,则在处理过程中将其绘制为形状:

void draw() {
  // draw the inner circle with a "fat" stroke
  strokeWeight(20);
  // assuming center mode
  ellipse(width/2, height/2, 100, 100);

  // reset that stroke fatness
  strokeWeight(1);
  // make sure we'll be rotating about the center of the sketch
  translate(width/2, height/2);
  // and then start drawing eight 'teeth'
  for (int i=0; i<8; i++) {
    beginShape();
    // we know where p1, p2, and p3 are.
    vertex(p1.x, p1.y);
    // and we "guessed" at c1, c2, c3, and c4.
    bezierVertex(c1.x, c1.y, c2.y, c2.y, p2.x, p2.y);
    bezierVertex(c3.x, c3.y, c4.y, c4.y, p3.x, p3.y);
    // We leave the shape "open" in case you want both stroke and fill
    endShape();
    // we're drawing eight teeth, so we need to rotate by 2*PI/8 each time
    rotate(0.25 * PI);
  }
}
void draw(){
//用“胖”笔划画出内圈
冲程重量(20);
//假设中心模式
椭圆(宽/2,高/21000);
//重置中风肥胖
冲程重量(1);
//确保我们将围绕草图的中心旋转
平移(宽度/2,高度/2);
//然后开始画八颗“牙齿”

对于(int i=0;如果你概述了你如何得出这些观点的过程,我的答案会有很大的改进。另外请注意,这是一个问题,因此你发布的代码在OP的语言中不起作用。我感谢你在这方面所做的努力,你得到了类似的输出结果,但德尔菲/数学是我无法理解的。这个答案将是grea如果你概述了你提出这些观点的过程,我会有很大的改进。另外请注意,这是一个问题,因此你发布的代码在OP的语言中不起作用。我很感激你在这方面所做的努力,你得到了类似的输出结果,但Delphi/math超出了我的理解。这是一张很小的图片。这是一张很小的图片。我花了几乎所有的时间学习贝塞尔曲线一年。我最终使用Inkscape跟踪源图像,然后我发现Inkscape使用不同的坐标系进行处理。无论如何,感谢您的帮助!结果如下:)我花了将近一年的时间学习贝塞尔曲线。我最终使用Inkscape跟踪源图像,然后我发现Inkscape使用不同的坐标系进行处理。无论如何,感谢您的帮助!结果如下:)