在java中如何画椭圆_如何在除了冲压之外的Python龟图形中绘制椭圆?

在测试@ moomoomoo309的椭圆代码并发现问题(打印错误的地方,宽度和高度与参数不匹配,忽略龟头,因此无法打印倾斜的椭圆, Headers 不跟踪绘图,不会使笔处于原始状态等我决定尝试自己写 .

我选择使用 turtle.circle() 作为相对于现有龟位置和 Headers 绘制椭圆的位置的模型,允许用户更改步骤(即制作其他不规则多边形),保留笔状态和开始位置,这就是我提出的(我使用了 self 而不是 turtle 或 pen ,因为我打算将其作为方法安装):

import turtle

import math

def ellipse(self, x_radius, y_radius, steps=60):

down = self.isdown() # record pen state for restoration later

if not down:

self.pendown()

heading_radians = math.radians(self.heading())

theta_radians = -math.pi / 2

extent_radians = 2 * math.pi

step_radians = extent_radians / steps

extent_radians += theta_radians

x_center, y_start = self.position()

y_center = y_start + y_radius

cos_heading, sin_heading = math.cos(heading_radians), math.sin(heading_radians)

while True:

x, y = x_center + math.cos(theta_radians) * x_radius, y_center + math.sin(theta_radians) * y_radius

# readjust x & y to set the angle of the ellipse based on the original heading of the turtle

x, y = x - x_center, y - y_start

x, y = x * cos_heading - y * sin_heading, x * sin_heading + y * cos_heading

x, y = x + x_center, y + y_start

self.setheading(self.towards(x, y)) # turtle faces direction in which ellipse is drawn

self.goto(x, y)

if theta_radians == extent_radians:

break

theta_radians = min(theta_radians + step_radians, extent_radians) # don't overshoot our starting point

self.setheading(self.towards(x_center, y_start)) # set correct heading for the next thing we draw

if not down: # restore pen state on return

self.penup()

from functools import partial

yertle = turtle.Turtle()

yertle.ellipse = partial(ellipse, yertle)

演示代码以显示我们可以使用 turtle.ellipse() 绘制的所有新形状:

if __name__ == "__main__":

from functools import partial

yertle = turtle.Turtle()

yertle.ellipse = partial(ellipse, yertle)

import random

yertle.speed("fastest")

yertle.hideturtle()

yertle.penup()

screen = turtle.Screen()

for _ in range(75):

radius = random.randint(10, 50)

yertle.setheading(random.randint(0, 360))

yertle.setx(random.randint(-screen.window_width()/2 + radius * 2, screen.window_width()/2 - radius * 2))

yertle.sety(random.randint(-screen.window_height()/2 + radius + 2, screen.window_height()/2 - radius * 2))

yertle.color((random.random(), random.random(), random.random()), (random.random(), random.random(), random.random()))

flag = random.choice([True, False, False])

if flag:

yertle.begin_fill()

yertle.ellipse(radius, radius / 0.5 + random.random() * 3, steps=random.choice([3, 4, 5, 6, 7, 8, 60, 60, 60]))

if flag:

yertle.end_fill()

screen.exitonclick()

EXAMPLE OUTPUT

J9jWE.png

我试图实现 extent a la turtle.circle() 但是无法使其适当地在任意范围内工作(即以这样的方式,你可以以相同的范围调用 turtle.ellipse() 两次,并让它继续它停止的曲线)所以我已经离开了那一天 .

将我的答案带回OP的原始问题,我们现在可以做到:

import turtle

import math

def ellipse(self, x_radius, y_radius, steps=60):

# ...

def draw_O():

# Draw an O

turtle.penup()

turtle.forward(letter_height/4)

turtle.pendown()

ellipse(turtle, letter_width, letter_height)

turtle.penup()

turtle.forward(space_width + letter_height/4)

turtle.pendown()

letter_width = 10

letter_height = 170

space_width = 5

turtle.onkey(draw_O, "o")

turtle.listen()

turtle.done()

要生成OP所需的基于椭圆的骨骼字母O:

EQU35.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值