簡體   English   中英

圖形:如何在線條之間填充顏色?

[英]Graphics: How to Fill Color Between Lines?

我正在嘗試設計圓形的QR碼。 我必須用python編寫代碼,但是我對此沒有太多經驗。 經過大量的努力,我創建了形狀。 現在我需要在這些形狀之間填充顏色,但是我做不到。 我的輸出圖形當前看起來像這樣:

當前輸出的屏幕截圖

我需要用顏色填充那些空的形狀。 下面給出了我為創建此圖形而實現的代碼。 我不確定我是否使用了正確的庫。 我看到了許多有關matplotlib.pyplot的示例,但我認為它對於創建圖表更有用。 因此,任何貢獻表示贊賞。 我真的被困住了。

from graphics import *
import math

def rect(r, theta):
    """theta in degrees

    returns tuple; (float, float); (x,y)
    """
    x = r * math.cos(math.radians(theta))
    y = r * math.sin(math.radians(theta))
    return x, y


def polar(x, y):
    """returns r, theta(degrees)
    """
    r = (x ** 2 + y ** 2) ** .5
    if y == 0:
        theta = 180 if x < 0 else 0
    elif x == 0:
        theta = 90 if y > 0 else 270
    else:
        theta = math.degrees(math.atan(float(y) / x))
    return r, theta


def main():
    win = GraphWin('Canvas', 640, 480)  # give title and dimensions
    win.setCoords(-320, -240, 320, 240)

    seventh = Circle(Point(0, 0), 90)  # set center and radius
    # seventh.setFill("yellow")
    seventh.draw(win)

    sixth = Circle(Point(0, 0), 80)  # set center and radius
    # sixth.setFill("yellow")
    sixth.draw(win)

    fifth = Circle(Point(0, 0), 70)  # set center and radius
    # fifth.setFill("yellow")
    fifth.draw(win)

    fourth = Circle(Point(0, 0), 60)  # set center and radius
    # fourth.setFill("yellow")
    fourth.draw(win)

    third = Circle(Point(0, 0), 50)  # set center and radius
    # third.setFill("yellow")
    third.draw(win)

    second = Circle(Point(0, 0), 40)  # set center and radius
    # second.setFill("yellow")
    second.draw(win)

    first = Circle(Point(0, 0), 30)  # set center and radius
    # first.setFill("yellow")
    first.draw(win)

    line = Line(Point(0, 0), Point(rect(90, 0)[0], rect(90, 0)[1]))
    line.draw(win)

    line2 = Line(Point(0, 0), Point(rect(90, 30)[0], rect(90, 30)[1]))
    line2.draw(win)

    line3 = Line(Point(0, 0), Point(rect(90, 60)[0], rect(90, 60)[1]))
    line3.draw(win)

    line4 = Line(Point(0, 0), Point(rect(90, 90)[0], rect(90, 90)[1]))
    line4.draw(win)

    line5 = Line(Point(0, 0), Point(rect(90, 120)[0], rect(90, 120)[1]))
    line5.draw(win)

    line6 = Line(Point(0, 0), Point(rect(90, 150)[0], rect(90, 150)[1]))
    line6.draw(win)

    line7 = Line(Point(0, 0), Point(rect(90, 180)[0], rect(90, 180)[1]))
    line7.draw(win)

    line8 = Line(Point(0, 0), Point(rect(90, 210)[0], rect(90, 210)[1]))
    line8.draw(win)

    line9 = Line(Point(0, 0), Point(rect(90, 240)[0], rect(90, 240)[1]))
    line9.draw(win)

    line10 = Line(Point(0, 0), Point(rect(90, 270)[0], rect(90, 270)[1]))
    line10.draw(win)

    line11 = Line(Point(0, 0), Point(rect(90, 300)[0], rect(90, 300)[1]))
    line11.draw(win)

    line12 = Line(Point(0, 0), Point(rect(90, 330)[0], rect(90, 330)[1]))
    line12.draw(win)

    line13 = Line(Point(0, 0), Point(rect(90, 360)[0], rect(90, 360)[1]))
    line13.draw(win)

    line14 = Line(Point(0, 0), Point(rect(90, 210)[0], rect(90, 210)[1]))
    line14.draw(win)

    first.setFill('black')


    message = Text(Point(0, 200), 'Click anywhere to quit.')
    message.draw(win)
    win.getMouse()

    win.close()

main()

如果可以實現,我想畫一張看起來像這樣的圖片(在Photoshop中繪制):

用Photoshop創建所需圖像的屏幕截圖

經過一些有用的評論后,我決定找到另一個合適的python模塊。 但是我找不到合適的。 如果有人了解我的問題可以建議適當的python模塊?

我相信同樣基於tkinter構建的Python Turtle具有足夠的功能,可以使用更直觀的邏輯來模擬您的圓形QR代碼:

from math import pi, sin, cos
from turtle import Turtle, Screen

TWO_PI = pi * 2

SEGMENTS = 10  # pie slices
SECTORS = 8  # concentric circles
MAXIMUM_RADIUS = 100
MINIMUM_RADIUS = 10
DELTA_RADIUS = (MAXIMUM_RADIUS - MINIMUM_RADIUS) // SECTORS
SEGMENT_EXTENT = TWO_PI / SEGMENTS
DEFAULT_LINE_WIDTH = 1

DATA = [  # data to match OP's example chart
    (2, 0), (2, 3), (2, 5), (2, 6), (2, 9),
    (3, 0), (3, 1), (3, 3), (3, 4), (3, 6),
    (4, 1), (4, 2), (4, 7), (4, 8),
    (5, 0), (5, 1), (5, 4), (5, 5), (5, 6), (5, 7),
    (6, 3), (6, 5), (6, 8), (6, 9),
    (7, 0), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (7, 8),
    ]

def centered_circle(turtle, radius, extent=TWO_PI):
    """ draw a circle centered about the current turtle location """

    position = turtle.position()
    heading = turtle.heading()

    turtle.penup()
    turtle.setx(turtle.xcor() + cos(heading) * radius)
    turtle.sety(turtle.ycor() - sin(heading) * radius)
    turtle.pendown()

    turtle.circle(radius, extent, steps=60)

    turtle.penup()
    turtle.setposition(position)  # return turtle to starting position
    turtle.pendown()

def draw_blank_chart(turtle):
    """ draw the empty chart """

    turtle.dot(MINIMUM_RADIUS * 2)  # center of chart

    for radius in range(MINIMUM_RADIUS + DELTA_RADIUS, MAXIMUM_RADIUS + 1, DELTA_RADIUS):
        centered_circle(turtle, radius)  # divide chart into sectors

    turtle.width(2 * DELTA_RADIUS / 3)  # outer edge of chart
    centered_circle(turtle, MAXIMUM_RADIUS + DELTA_RADIUS)
    turtle.width(DEFAULT_LINE_WIDTH)

    for _ in range(SEGMENTS):  # divide chart into segments
        turtle.forward(MAXIMUM_RADIUS + DELTA_RADIUS)
        turtle.backward(MAXIMUM_RADIUS + DELTA_RADIUS)
        turtle.left(SEGMENT_EXTENT)

def set_bit(turtle, sector, segment):
    """ turn on (blacken) one sector:segment of chart """

    turtle.setheading(SEGMENT_EXTENT * segment - pi/2)
    turtle.width(DELTA_RADIUS)
    centered_circle(turtle, (MINIMUM_RADIUS + DELTA_RADIUS * sector + DELTA_RADIUS/2), -SEGMENT_EXTENT)

screen = Screen()
screen.mode('logo')  # force zero degrees to be straight up

yertle = Turtle(visible=False)
yertle.width(DEFAULT_LINE_WIDTH)
yertle.speed('fastest')
yertle.radians()  # to make working with sin and cos easier

draw_blank_chart(yertle)

for sector, segment in DATA:
    set_bit(yertle, sector, segment)

screen.exitonclick()

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM