Gran
def draw_tree(img,x1:float,y_1:float, height:float, width:float,tree_color):
corner_x1=normalized_to_pixelx(x_1)
corner_x2=normalized_to_pixely(y_1)
width=normalized_to_pixelx(width)
height=normalized_to_pixely(height)
Jag skapade detta så länge och sen har jag även for x in range(1, antal_trianglar+1) men kommer ingenvart. Jag vill gärna använda triangeln jag ritade förut och på något sätt lägga till den så den står på varandra
destiny99 skrev:Jag vill gärna använda triangeln jag ritade förut och på något sätt lägga till den så den står på varandra
Kan du visa den koden? Det känns som om detta kan gå emot tanken med uppgiften. Meningen är att du ska använda ditt x i iteratorn (kanske dåligt namn eftersom du har x1 som variabel också) för att räkna fram triangeln med färg, form och position.
Nu kanske du tänker att du redan har färg och form redo och bara ska använda iteratorn till position, men jag är rädd att effekten blir att du bara flyttar samma triangel tre gånger. Du måste skapa en ny triangel varje gång också.
thedifference skrev:destiny99 skrev:Jag vill gärna använda triangeln jag ritade förut och på något sätt lägga till den så den står på varandra
Kan du visa den koden? Det känns som om detta kan gå emot tanken med uppgiften. Meningen är att du ska använda ditt x i iteratorn (kanske dåligt namn eftersom du har x1 som variabel också) för att räkna fram triangeln med färg, form och position.
Nu kanske du tänker att du redan har färg och form redo och bara ska använda iteratorn till position, men jag är rädd att effekten blir att du bara flyttar samma triangel tre gånger. Du måste skapa en ny triangel varje gång också.
Jag vet inte allt jag gör riktigt eftersom jag vill gärna tänka ett steg i taget då programmering är svårt för mig. Så jag är inte säker på om jag är med på dina tankegångar, men det är synd att vi inte kan använda triangeln i tidigare uppgiften för att skapa granen. Men jag klistrar in koden för den triangeln. (Kommer snart)
Så något i stil med for n in range(tree_color, position ( x1,y1) , height , width)? Är det vad du menar med att räkna fram triangeln med färg,form och position?
Ser ingen kod för triangel.
Kolla på denna pseudokod.
triangle_height = height / 4
for i in range(3): # vi skapar tre trianglar
triangle = Triangle() # ny triangel (du skapar den antagligen inte på detta vis)
triangle.width = width # alltid samma bredd
triangle.height = triangle_height # alltid samma höjd
triangle.bottom_y = triangle_height * i # vi flyttar y-koordinaten vid varje iteration
triangle.put_in_image() # lägg till triangeln vi nyss skapat
Här använder vi iteratorvariabeln i för att ange y-koordinaten för varje ny triangel. Jag har inte sett din triangelkod och kan inte tkinter, så jag vet inte hur riktig kod skulle se ut.
Kolla även detta exempel:
my_mood = "glad"
for i in range(10):
print(f"Hej jag är {my_mood}!")
print(f"Jag har sagt detta {i} gånger tidigare.")
Du ser att den första raden alltid är densamma, precis som din triangels utseende alltid är detsamma. Bredd, höjd, och färg är alltså inget du ska iterera över, utan de läggs alltid in likadana i loopen, precis som my_mood. Däremot använder jag iteratorvariablen i för att säga hur många gånger jag upprepat mig.
(Fullt möjligt att du anger höjd genom att ange över och nedre y-koordinater dock, i vilket fall de behöver ändras för varje iteration.)
def draw_triangle(img,x_1,y_1,x_2,y_2 ,x_3,y_3,triangle_color):
corner_1 = (normalized_to_pixel_x(x_1), normalized_to_pixel_y(y_1))
corner_2 = (normalized_to_pixel_x(x_2), normalized_to_pixel_y(y_2))
corner_3=(normalized_to_pixel_x(x_3),normalized_to_pixel_y(y_3))
area0= triangle_area(corner_1,corner_2,corner_3)
for x in range(min(corner_1[0],corner_2[0],corner_3[0]), max(corner_1[0],corner_2[0],corner_3[0])):
for y in range(min(corner_1[1],corner_2[1],corner_3[1]), max(corner_1[1],corner_2[1],corner_3[1])):
area1 = triangle_area((x,y), corner_1, corner_2)
area2 = triangle_area((x,y),corner_1,corner_3)
area3 = triangle_area((x,y),corner_2,corner_3)
if abs(area0-area1-area2-area3)<0.0001:
img.put(triangle_color,(x,y))
def triangle_area(corner_1,corner_2,corner_3):
side_1=math.sqrt((corner_2[0]-corner_1[0])**2+(corner_2[1]-corner_1[1])**2)
side_2=math.sqrt((corner_3[0]-corner_2[0])**2+(corner_3[1]-corner_2[1])**2)
side_3=math.sqrt((corner_3[0]-corner_1[0])**2+(corner_3[1]-corner_1[1])**2)
s=(side_1+side_2+side_3)/2
area = math.sqrt(abs((s*(s-side_1)*(s-side_2)*(s-side_3))))
return area
här är koden för triangeln som räknar area osv
Den ser väldigt bra ut =)
Då blir din pseudkod typ detta:
def draw_tree(img,x1:float, y_1:float, height:float, width:float, tree_color):
# bestäm x1, x2 och x3 - dessa är samma för alla trianglar
for i in range(3):
# bestäm y1, y2 och y3 för just denna triangel
# använd i för att skapa någon form av förskjutning
draw_triangle(img, x_1, y_1, x_2, y_2, x_3, y_3, tree_color)
# rita rektangeln
thedifference skrev:Den ser väldigt bra ut =)
Då blir din pseudkod typ detta:
def draw_tree(img,x1:float, y_1:float, height:float, width:float, tree_color): # bestäm x1, x2 och x3 - dessa är samma för alla trianglar for i in range(3): # bestäm y1, y2 och y3 för just denna triangel # använd i för att skapa någon form av förskjutning draw_triangle(img, x_1, y_1, x_2, y_2, x_3, y_3, tree_color) # rita rektangeln
#bestäm x1,x2 och x3. dessa är samma för alla trianglar. Menar du att jag ska ange dem som koordinater normalized_pixel och sen mata in deras värden? ska dem alla ha samma värden? jag har ju inte angett x2,x3 i argument def?
du säger att jag ska skapa y1, y2 och y3 koordinater. Ska jag tilldela dem värden precis som jag gjorde med x1,x2 och x3?
en annan sak jag inte förstår är vad du menar med att jag ska använda i in range(3) för att skapa en förskjutning? vad menas med en förskjutning i koden?
from tkinter import*
from main import*
def draw_tree(img,tree_x1:float,tree_y1:float,tree_height:float,tree_width:float,tree_color,n_triangles: 3):
tree_corner = (normalized_to_pixel_x(tree_x1), normalized_to_pixel_y(tree_y1))
height = normalized_to_pixel_x(tree_height)
width=normalized_to_pixel_y(tree_width)
hur ska jag göra med tree_corner, height och width variablerna ?
Jag menar att du ska ta fram tre variabler x_1, x_2 och x_3. Alla tre trianglarna har ju samma x-koordinater för sina hörn, eller hur?
De har däremot inte samma y-koordinater.
Lite tidsnöd just nu men hoppas detta gör det tydligare:
def draw_tree(img,x1:float,x2:float,x3:float,y1:float,y2:float,y3:float,tree_height:float,tree_width:float,tree_color):
triangles_xcoordinates= [x1,x2,x3]
triangles_xcoordinates[0]=0.4
triangles_xcoordinates[1]=0.4
triangles_xcoordinates[2]=0.4
Ja okej jag förstår. då menar du antagligen såhär? i def funktionen jag har i min kod har jag inte definierat x2,x3 koordinater som jag gjorde med x1 och y1. Ska man göra det?
Nej, du får inte ändra parametrarna för draw_tree. Du kan inte heller hårdkoda x-koordinaterna, och de ska inte vara en lista.
Nu tar vi det här från början. draw_tree får
img: bilden som ska ritas på
corner_x: x-koordinat för övre vänstra hörnet
corner_y: y-koordinat för övre vänstra hörnet
width: bredd på hela granen
height: hög på hela granen
tree_color: färg på barren
Nu säger vi att corner_x blir 5 och corner_y blir 10, alltså är övre vänstra hörnet i (5, 10).
Vi säger vidare att bredden är 4 och höjden är 8. Markerat är då det utrymme som granen ska ritas inom.
Vi säger att varje triangel får 1/4 av höjden (stommen får sista fjärdedelen).
Då behöver du en uppsättning koordinater för varje hörn på varje triangel här.
Den översta kommer alltså ritas genom
draw_triangle(img, 5, 8, 9, 8, 7, 10, tree_color)
Men du ska använda de parametrar du fick för att räkna fram dessa värden. De ska inte hårdkodas. Om du får andra koordinater för övre vänstra hörnet, annan bredd och annan höjd ska din kod klara det lika bra.
Till exempel är en av x-koordinaterna densamma som x-koordinaten för övre vänstra hörnet. En annan är denna x-koordinat plus bredden. Hänger du med?
Börja med att ta fram tre variabler x_1, x_2 och x_3 som gäller för alla tre trianglar. Skriv dessa som en funktion av de parametrar du fått.
thedifference skrev:Nej, du får inte ändra parametrarna för draw_tree. Du kan inte heller hårdkoda x-koordinaterna, och de ska inte vara en lista.
Nu tar vi det här från början. draw_tree får
img: bilden som ska ritas på
corner_x: x-koordinat för övre vänstra hörnet
corner_y: y-koordinat för övre vänstra hörnet
width: bredd på hela granen
height: hög på hela granen
tree_color: färg på barrenNu säger vi att corner_x blir 5 och corner_y blir 10, alltså är övre vänstra hörnet i (5, 10).
Vi säger vidare att bredden är 4 och höjden är 8. Markerat är då det utrymme som granen ska ritas inom.
Vi säger att varje triangel får 1/4 av höjden (stommen får sista fjärdedelen).
Då behöver du en uppsättning koordinater för varje hörn på varje triangel här.
Den översta kommer alltså ritas genom
draw_triangle(img, 5, 8, 9, 8, 7, 10, tree_color)
Men du ska använda de parametrar du fick för att räkna fram dessa värden. De ska inte hårdkodas. Om du får andra koordinater för övre vänstra hörnet, annan bredd och annan höjd ska din kod klara det lika bra.
Till exempel är en av x-koordinaterna densamma som x-koordinaten för övre vänstra hörnet. En annan är denna x-koordinat plus bredden. Hänger du med?
Börja med att ta fram tre variabler x_1, x_2 och x_3 som gäller för alla tre trianglar. Skriv dessa som en funktion av de parametrar du fått.
"Till exempel är en av x-koordinaterna densamma som x-koordinaten för övre vänstra hörnet. En annan är denna x-koordinat plus bredden. Hänger du med?"
Nej jag hänger inte med på varför ena x-koordinat läggs till bredden för den andra triangeln?
"Börja med att ta fram tre variabler x_1, x_2 och x_3 som gäller för alla tre trianglar. Skriv dessa som en funktion av de parametrar du fått."
Menar du såhär: triangles_xcoordinates=[x1,x2,x3]?
Nej. Inga listor.
Titta på den första triangeln. Nedre vänstra hörnet har x-koordinaten 5. Det är samma som övre vänstra hörnet. Det är även samma som nedre vänstra hörnet för trianglarna under. Detta får du som en parameter till draw_tree.
Alltså
x_1 = corner_x (du kallade denna parameter x1 i ditt första inlägg)
x_2 = ?
x_3 = ?
thedifference skrev:Nej. Inga listor.
Titta på den första triangeln. Nedre vänstra hörnet har x-koordinaten 5. Det är samma som övre vänstra hörnet. Det är även samma som nedre vänstra hörnet för trianglarna under. Detta får du som en parameter till draw_tree.
Alltså
x_1 = corner_x (du kallade denna parameter x1 i ditt första inlägg)
x_2 = ?
x_3 = ?
Menar du att den orangea bilden har samma x-koordinat dvs x-koordinat = 5 i vänstra hörn som den blåa och röda triangeln med samma vänstra hörn? Jag håller med om att det är så.
"Alltså
x_1 = corner_x (du kallade denna parameter x1 i ditt första inlägg)x_2 = ?x_3 = ?"
Ja det gjorde jag.
corner_xupperleft= x_1
corner_xmiddleleft=x_2
corner_xbottomleft=x_3
Så menar du?
Menar du att den orangea bilden har x-koordinat=5 i vänstra hörn som den blåa och röda triangeln med samma vänstra hörn? Jag håller med om att det är så.
Ja, men detta är även samma x-koordinat som du fick som parameter för övre vänstra hörnet.
Försök igen. Du får bara byta ut frågetecknen, och de ska bytas ut mot något som jobbar med de parametrar du får.
def draw_tree(img, corner_x: float, corner_y: float, height: float, width: float, tree_color):
x_1 = ? # x för nedre vänstra hörnet för ALLA trianglar
x_2 = ? # x för övre hörnet för ALLA trianglar
x_3 = ? # x för nedre högra hörnet för ALLA trianglar
thedifference skrev:Menar du att den orangea bilden har x-koordinat=5 i vänstra hörn som den blåa och röda triangeln med samma vänstra hörn? Jag håller med om att det är så.
Ja, men detta är även samma x-koordinat som du fick som parameter för övre vänstra hörnet.
Försök igen. Du får bara byta ut frågetecknen, och de ska bytas ut mot något som jobbar med de parametrar du får.
def draw_tree(img, corner_x: float, corner_y: float, height: float, width: float, tree_color): x_1 = ? # x för nedre vänstra hörnet för ALLA trianglar x_2 = ? # x för övre hörnet för ALLA trianglar x_3 = ? # x för nedre högra hörnet för ALLA trianglar
Jag förstär inte vilka parametrar du menar som man jobbar med.
Men jag gissar att du menar
x_1=corner_x
x_2=corner_x
x_3=corner_x
Parametrarna är allt inom parentesen för draw_tree, d.v.s. argumenten till funktionen.
x_1 är rätt.
Läs mina kommentarer. x_2 är vad som blev 7 i mina bilder, och x_3 är vad som blev 9.
Det här är hur variablerna kommer användas. Ignorera alla yn; jag bara har dem där för att poängtera att det är koordinater.
Om du inte hänger med kanske vi ska ta ett steg tillbaka och tänka oss detta som en matteuppgift.
thedifference skrev:Det här är hur variablerna kommer användas. Ignorera alla yn; jag bara har dem där för att poängtera att det är koordinater.
Om du inte hänger med kanske vi ska ta ett steg tillbaka och tänka oss detta som en matteuppgift.
jag fick hjälp med koden nu av en kursare så det ser ut såhär. Det löste sig! Detta var en av de svåraste labb jag skådat om jag ska vara ärlig.
def draw_tree(img, upper_left_x: float, upper_left_y: float, height: float, width: float, bark_color: str = "#5C4033"):
"Draws a tree"
x_center = upper_left_x
y_center = upper_left_y
TRIANGLE_COUNT = 3
TRIANGLE_HEIGHT = height / TRIANGLE_COUNT
for triangles in range(TRIANGLE_COUNT):
p1 = (x_center, y_center + (TRIANGLE_HEIGHT * triangles))
p2 = (x_center - width, (y_center + TRIANGLE_HEIGHT) + (TRIANGLE_HEIGHT * triangles))
p3= (x_center + width, (y_center + TRIANGLE_HEIGHT) + (TRIANGLE_HEIGHT * triangles))
draw_triangle(img, p1[0], p1[1], p2[0], p2[1], p3[0], p3[1], GREEN)
rectangle_height = 0.07
rectangle(img, x_center - width / 5, y_center + height,
x_center+ width / 5, y_center + height + rectangle_height, bark_color)
def draw_scene(img, tree_upper_left_x: float, tree_upper_left_y, tree_height: float, tree_width: float,
tree_bark_color: str = "#5C4033"):
"""Ritar hela scenen inklusive träd, hus och solen."""
x0, y0 = 0, 0
x1, y1 = pixel_to_normalized_width(WIDTH), pixel_to_normalized_height(HEIGHT)
x_center, y_center = x1 / 2, y1 / 2