Skapa olika mönster av linjer i Java med hjälp av loopar?

Permalänk
Medlem

Skapa olika mönster av linjer i Java med hjälp av loopar?

Sitter och klurar på vad jag antar vara en klassisk uppgift, hur man skapar fler linjer i Java med hjälp av loopar. Jag får för mig att det är while jag ska använda för att upprepa antal linjer ett visst antal ggr men längre än så kommer jag inte. Linjerna ska gå som solstrålar ut från det vänstra övre hörnet och täcka halva panelen.

Hur får jag detta till att fungera? Förstår mig inte riktigt på hur jag ska forma while loopen och inte heller uträkningarna. Någon som kan hjälpa mig med kod eller tips?

Just nu ser koden hittils ut såhär:

import java.awt.Graphics;
import javax.swing.JPanel;

public class DrawPanel extends JPanel
{
public void paintComponent( Graphics g )
{

super.paintComponent( g );

int width = getWidth();
int height = getHeight();
int linesToDraw = 15;

while (linesToDraw < 15)
{

g.drawLine ( 0, 0, width, height );
g.drawLine ( 0, height, width, 0 );
}

}

}

Permalänk
Medlem
Skrivet av radera:

Sitter och klurar på vad jag antar vara en klassisk uppgift, hur man skapar fler linjer i Java med hjälp av loopar. Jag får för mig att det är while jag ska använda för att upprepa antal linjer ett visst antal ggr men längre än så kommer jag inte. Linjerna ska gå som solstrålar ut från det vänstra övre hörnet och täcka halva panelen.

Hur får jag detta till att fungera? Förstår mig inte riktigt på hur jag ska forma while loopen och inte heller uträkningarna. Någon som kan hjälpa mig med kod eller tips?

Just nu ser koden hittils ut såhär:

import java.awt.Graphics;
import javax.swing.JPanel;

public class DrawPanel extends JPanel
{
public void paintComponent( Graphics g )
{

super.paintComponent( g );

int width = getWidth();
int height = getHeight();
int linesToDraw = 15;

while (linesToDraw < 15)
{

g.drawLine ( 0, 0, width, height );
g.drawLine ( 0, height, width, 0 );
}

}

}

Du vill troligtvis använda en FOR-loop:

for (int räknare=0; räknare < getHeight(); räknare += mellanrum) { // din kod här }

Just denna for-loopen är definierad att börja på 0 (int räknare=0) och fortsätta så länge variabeln är mindre än höjden av din JPanel (räknare < getHeight()). För varje varv i loopen läggs värdet i "mellanrum" till variabeln (räknare += mellanrum).

Variabelnamnen är helt godtyckliga och du använder det som känns mest lämpligt.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Du vill troligtvis använda en FOR-loop:

for (int räknare=0; räknare < getHeight(); räknare += mellanrum) { // din kod här }

Just denna for-loopen är definierad att börja på 0 (int räknare=0) och fortsätta så länge variabeln är mindre än höjden av din JPanel (räknare < getHeight()). För varje varv i loopen läggs värdet i "mellanrum" till variabeln (räknare += mellanrum).

Variabelnamnen är helt godtyckliga och du använder det som känns mest lämpligt.

Okej, tyvärr blev jag inte klokare för det, inte mer än att jag kanske bör använda en for-loop Kanske ska förtydliga lite med vilka mönster jag vill skapa: http://javaclass.billkrieger.com/classes/week2/hints4.1.shtml

Det är i första hand det mönstret där linjerna strålar ut som solstrålar jag tänker på. Hur gör jag själva loopen och beräkningen? Det är där jag kört fast.

Permalänk
Medlem
Skrivet av radera:

Okej, tyvärr blev jag inte klokare för det, inte mer än att jag kanske bör använda en for-loop Kanske ska förtydliga lite med vilka mönster jag vill skapa: http://javaclass.billkrieger.com/classes/week2/hints4.1.shtml

Det är i första hand det mönstret där linjerna strålar ut som solstrålar jag tänker på. Hur gör jag själva loopen och beräkningen? Det är där jag kört fast.

Det förklaras ju rätt bra i länken du postade hur man kan göra.

int linesToDraw = 15; int width = getWidth(); // total width int height = getHeight(); // total height int xDelta = width / linesToDraw; int yDelta = height / linesToDraw; // Put in a loop to draw draw lines from the // upper left corner to the end points as // follows: // x = width, y = 0 // x = width - delta, y = delta // x = width - 2 * delta, y = 2 * deltav // ... // x = (width - (n - 1) * delta), y = (n - 1) * delta

lite översatt, otestat, inte säker hur man skriver 2 variabler i for-loopar men om det inte går så är det bara flytta ut y tex:

for (int x=width, y=0;x>0;x -=delta, y +=delta) g.drawline(0,0,x,y)

Permalänk
Medlem
Skrivet av jurgen89:

Det förklaras ju rätt bra i länken du postade hur man kan göra.

int linesToDraw = 15; int width = getWidth(); // total width int height = getHeight(); // total height int xDelta = width / linesToDraw; int yDelta = height / linesToDraw; // Put in a loop to draw draw lines from the // upper left corner to the end points as // follows: // x = width, y = 0 // x = width - delta, y = delta // x = width - 2 * delta, y = 2 * deltav // ... // x = (width - (n - 1) * delta), y = (n - 1) * delta

lite översatt, otestat, inte säker hur man skriver 2 variabler i for-loopar men om det inte går så är det bara flytta ut y tex:

for (int x=width, y=0;x>0;x -=delta, y +=delta) g.drawline(0,0,x,y)

Får inte detta till att fungera, hur menar du att hela koden ska se ut?

Permalänk
Medlem
Skrivet av radera:

Får inte detta till att fungera, hur menar du att hela koden ska se ut?

Testade nu och det fungerar.
Tog all kod från din länk och la in loopen bara.

Permalänk
Medlem
Skrivet av jurgen89:

Testade nu och det fungerar.
Tog all kod från din länk och la in loopen bara.

Okej, då ska jag väl också kunna få det och fungera. Men det värsta är när man bara kopierar in såhär, om man är nybörjare som jag, så förstår man inte riktigt vad man gör. Skulle någon vilja förklara vad som sker just i loopen? Det är som sagt denna jag har svårt att förstå...

Permalänk
Medlem
Skrivet av radera:

Okej, då ska jag väl också kunna få det och fungera. Men det värsta är när man bara kopierar in såhär, om man är nybörjare som jag, så förstår man inte riktigt vad man gör. Skulle någon vilja förklara vad som sker just i loopen? Det är som sagt denna jag har svårt att förstå...

menar du det här?

for (int x=width, y=0;x>0;x -=delta, y +=delta) g.drawline(0,0,x,y)

drawLine fungerar såhär: http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Gra...

första punkten som linjen utgår från är alltid övre vänstra hörnet, alltså (0,0).
Andra punkten varierar för varje linje, (x,y).
Det loopen gör är att den ändrar värdena på x och y för varje linje som ritas.
Sen slutar den när x-värdet blir negativt.

Permalänk
Medlem
Skrivet av jurgen89:

menar du det här?

for (int x=width, y=0;x>0;x -=delta, y +=delta) g.drawline(0,0,x,y)

drawLine fungerar såhär: http://download.oracle.com/javase/1.4.2/docs/api/java/awt/Gra...

första punkten som linjen utgår från är alltid övre vänstra hörnet, alltså (0,0).
Andra punkten varierar för varje linje, (x,y).
Det loopen gör är att den ändrar värdena på x och y för varje linje som ritas.
Sen slutar den när x-värdet blir negativt.

Att linjen utgår från övre vänstra hörnet är jag med på och att det är (0,0). Att x,y varierar för varje linje är jag inte riktigt med på? x borde väl vara samma eftersom alla linjer utgår från samma hörn/punkt? Därefter borde väl y ändras? OM vi nu tänker på "solstråle" mönstret vill säga.

Sen förstår jag inte for loopen? Hur visar for loopen att det ska ritas linjer från samma hörn och med samma avstånd mellan och lika långa? Svårt att förklara med...

Permalänk
Medlem
Skrivet av radera:

Att linjen utgår från övre vänstra hörnet är jag med på och att det är (0,0). Att x,y varierar för varje linje är jag inte riktigt med på? x borde väl vara samma eftersom alla linjer utgår från samma hörn/punkt? Därefter borde väl y ändras? OM vi nu tänker på "solstråle" mönstret vill säga.

Sen förstår jag inte for loopen? Hur visar for loopen att det ska ritas linjer från samma hörn och med samma avstånd mellan och lika långa? Svårt att förklara med...

Den andra punkten (x,y) är slutpunkten för linjen.
Rita ett koordinatsystem på papper med omvänd y-axel (alltså att högre y-värden kommer längre nedåt). Dra därefter några linjer så som "solstråle"-mönstret ser ut så ser man ganska tydligt att både x- och y-värdena ändras, x-värdena minskar och y-värdena ökar för varje linje om första linjen är den längst upp.

Loopen ökar y-värdet för varje linje för att förflytta slutpunkten längre nedåt.
x-värdet ökas för att förflytta slutpunkten mot högra delen av panelen.
Ökar man inte x-värdet får du linjer som alltid går till högre delen av panelen men slutar längre och längre ned.

Permalänk
Medlem

Om du är mer bekväm med while loopar så kanske du förstår denna metod bättre.
Den gör samma sak som forloopen men ser inte i närheten lika grisig ut

int x = width; int y = 0; while (x > 0) { x = x - xDelta; y = y + yDelta; g.drawLine(0, 0, x, y); }

Permalänk
Medlem

eeeh... menar du inte:

int x = width; int y = 0; while (x > 0) { g.drawLine(0, 0, x, y); x = x - xDelta; y = y + yDelta; }

?
Sedan håller jag med dig, den här är inte alls lika grisig... den är mycket värre.... det går inte att få en snabb överblick på loopen.

EDIT: Vad dåligt samvete jag fick nu... det var ju ditt första inlägg ju! : /
Välkommen till forumet! Och fortsätt posta här på programmering och digitalt skapande, för vi har mycket roligare än alla andra avdelningar ;D

Visa signatur

citera!