17 svar
110 visningar
destiny99 behöver inte mer hjälp
destiny99 Online 7905
Postad: 12 okt 22:53 Redigerad: 12 okt 22:55

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

thedifference 373
Postad: 13 okt 06:51
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å.

destiny99 Online 7905
Postad: 13 okt 09:26 Redigerad: 13 okt 09:36
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?

thedifference 373
Postad: 13 okt 09:46 Redigerad: 13 okt 09:50

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.)

destiny99 Online 7905
Postad: 13 okt 10:17 Redigerad: 13 okt 10:19
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

thedifference 373
Postad: 13 okt 10:31

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
destiny99 Online 7905
Postad: 13 okt 10:37 Redigerad: 13 okt 10:41
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 ?

thedifference 373
Postad: 13 okt 10:44

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:

destiny99 Online 7905
Postad: 13 okt 10:56 Redigerad: 13 okt 11:21
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?

thedifference 373
Postad: 13 okt 12:22 Redigerad: 13 okt 12:25

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.

destiny99 Online 7905
Postad: 13 okt 12:50
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å 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.

"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]?

thedifference 373
Postad: 13 okt 12:53

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 = ?

destiny99 Online 7905
Postad: 13 okt 13:01 Redigerad: 13 okt 13:07
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?

thedifference 373
Postad: 13 okt 13:07

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
destiny99 Online 7905
Postad: 13 okt 13:15
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

thedifference 373
Postad: 13 okt 13:17

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.

thedifference 373
Postad: 13 okt 13:35 Redigerad: 13 okt 13:38

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.

destiny99 Online 7905
Postad: 13 okt 14:39 Redigerad: 13 okt 14:49
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
Svara
Close