Simple turtle graphics: Difference between revisions

Added an example implementation in Java
(Simple turtle graphics in FreeBASIC)
(Added an example implementation in Java)
 
(9 intermediate revisions by 5 users not shown)
Line 279:
New_Line;
end main;
</syntaxhighlight>
 
=={{header|EasyLang}}==
[https://easylang.dev/show/#cod=rVLBboMwDL3zFU/arVNpKEVaD3wJ4pCWtEGiSZWUsf79nEBQupbtspxsP/v5ObbtDwZSX0QCoBFnlGDO/CKj8NZ9tho9qIBf9KegpHuSJr76DcnV6CNO2gzcNFBIkY5E7yWO2nryFdRISTHbqjjWngJ/5lx6XavGFmSLzoopPHcm23ewnRBXsDQjLV7DrTcKPAhwPdYlOKFBpNS9FQH32dmHnyqo3xU/kVgb0US5OZtz9+w/gJHew/lSXbZ9gfhFuH3QdPOsB27Aq/ph2kU56/3TsJSFFjeNTihHFLbA3YXI9iyF8Q6v2npeyUKRpBKXh40vWU13RW8gZFdQ/LEgFhUpljH8hA6/ovIF9R93MP2r+8mKJCPPsWUMWc6cVyff Run it]
 
<syntaxhighlight lang="easylang">
subr home
deg = 0
x = 50
y = 50
down = 0
move x y
.
home
#
proc forward n . .
x += cos deg * n
y += sin deg * n
if down = 1
line x y
else
move x y
.
sleep 0.1
.
proc turn a . .
deg -= a
.
#
proc house . .
turn 180
forward 45
turn 180
down = 1
#
forward 30
turn 90
forward 30
turn 90
forward 30
turn 90
forward 30
#
turn 30
forward 30
turn 120
forward 30
home
.
house
#
proc bar a[] . .
turn 90
forward 30
turn -90
down = 1
for i to len a[]
max = higher max a[i]
.
for i to len a[]
h = a[i] / max * 50
w = 45 / len a[]
turn -90
forward h
turn 90
forward w
turn 90
forward h
turn -90
.
turn 180
forward 45
home
.
bar [ 50 33 200 130 50 ]
</syntaxhighlight>
 
Line 478 ⟶ 553:
{{out}}
[https://www.dropbox.com/s/tlmuza1o9foh8kt/Simple_turtle_graphics_FB.png?dl=0 Simple turtle graphics FreeBasic image]
 
=={{header|IS-BASIC}}==
<syntaxhighlight lang="is-basic">100 PROGRAM "Turtle.bas"
110 OPTION ANGLE DEGREES
120 GRAPHICS HIRES 4
130 CALL HOUSE(200,200,200)
140 SET INK 2:CALL CHART(450,200,1000,700)
150 DEF HOUSE(X,Y,L)
160 PLOT X,Y,ANGLE 0;
170 FOR I=1 TO 4
180 PLOT FORWARD 200,RIGHT 90;
190 NEXT
200 PLOT LEFT 60;FORWARD L;RIGHT 120;FORWARD L;X,Y,
210 END DEF
220 DEF CHART(X,Y,X1,Y1)
230 LET PC,MX=0
240 DO
250 READ IF MISSING EXIT DO:Z
260 LET PC=PC+1:LET MX=MAX(MX,Z)
270 LOOP
280 RESTORE
290 LET L=(X1-X)/PC:LET MX=(Y1-Y)/MX
300 PLOT X,Y,
310 DO
320 READ IF MISSING EXIT DO:Z
330 PLOT ANGLE 90;FORWARD Z*MX;RIGHT 90;FORWARD L;RIGHT 90;FORWARD Z*MX;RIGHT 90;FORWARD L
340 PLOT ANGLE 0;FORWARD L
350 LOOP
360 PLOT X,Y,
370 END DEF
380 DATA 90,60,300,200,90
</syntaxhighlight>
 
=={{header|J}}==
Line 549 ⟶ 656:
 
Note that we have used the Logo naming convention, which means that the height of our barchart is the <tt>width</tt> parameter in <tt>rectangle</tt> (and, likewise, the width of each bar is the <tt>height</tt> parameter in <tt>rectangle</tt>)
 
=={{header|Java}}==
Opens a javax.swing.JFrame, displaying the graphics shown in the screenshot:
 
[[File:Screenshot 001.png|alt=Screenshot of the Java implementation of task "Simple turtle graphics"|Screenshot of the Java implementation of task "Simple turtle graphics"]]
 
<syntaxhighlight lang="java">
 
/* Class Turtle starts here */
 
import java.awt.geom.AffineTransform;
 
public class Turtle extends java.lang.Object
{
private final java.awt.Graphics2D origin;
private java.awt.Graphics2D g2;
 
public Turtle(java.awt.Graphics2D origin)
{
this.origin = origin;
origin();
}
public void origin()
{
g2=(java.awt.Graphics2D)origin.create();
}
public void relativePosition(int xoff, int yoff)
{
AffineTransform at=g2.getTransform();
at.concatenate(AffineTransform.
getTranslateInstance(xoff,yoff));
g2.setTransform(at);
}
public void turnByDegrees(int thetaInDegrees)
{
AffineTransform at=g2.getTransform();
at.concatenate(AffineTransform.
getRotateInstance(Math.toRadians(thetaInDegrees)));
g2.setTransform(at);
}
public void forward(int len)
{
g2.drawLine(0,0,len,0);
relativePosition(len,0);
}
}
 
/* Class CanvasComponent starts here*/
 
import java.awt.Graphics;
import java.awt.Graphics2D;
 
public class CanvasComponent extends javax.swing.JComponent
{
protected void paintComponent(Graphics g)
{
Turtle turtle=new Turtle((Graphics2D)g);
 
turtle.origin();
 
turtle.relativePosition(50,50);
 
house(turtle,100,200,50);
 
turtle.origin();
 
turtle.relativePosition(200,50);
 
double[] numbers=new double[]{0.5, 0.33333, 2, 1.3, 0.5};
 
barchart(turtle,200,numbers);
}
private void barchart(Turtle turtle,int size,double[] numbers)
{
double max=0;
for(double d:numbers)
{
if(d>max)
max=d;
}
double width=size/ numbers.length;
int xpos=400;
for(double d:numbers)
{
int h=(int) (size * (d / max));
rectangle(turtle, (int)width, h);
xpos+=width;
turtle.relativePosition((int)width,0);
}
}
private void house(Turtle turtle,int width,
int height, int roofheight)
{
rectangle(turtle,width,height);
turtle.relativePosition(0,height);
double dist= Math.sqrt(roofheight*roofheight+width/2*width/2);
double angle= Math.toDegrees(Math.asin(roofheight/dist));
turtle.turnByDegrees((int)angle);
turtle.forward((int)dist);
turtle.turnByDegrees(-2*(int)angle);
turtle.forward((int)dist);
}
private void rectangle(Turtle turtle,int width, int height)
{
for(int i=0;i<2;++i)
{
turtle.forward(width);
turtle.turnByDegrees(90);
turtle.forward(height);
turtle.turnByDegrees(90);
}
 
}
}
 
/* Class MainClass starts here */
 
import javax.swing.*;
import java.awt.*;
 
public class MainClass
{
public static void main(String[] args)
{
CanvasComponent canvas=new CanvasComponent();
canvas.setPreferredSize(new Dimension(800,600));
JFrame f=new JFrame();
JPanel p=new JPanel(new BorderLayout());
p.add(canvas);
f.setContentPane(p);
f.setDefaultCloseOperation(f.EXIT_ON_CLOSE);
f.pack();
f.setVisible(true);
}
}
</syntaxhighlight>
 
=={{header|Julia}}==
Line 1,104 ⟶ 1,347:
{{libheader|DOME}}
{{libheader|Wren-turtle}}
<syntaxhighlight lang="ecmascriptwren">import "dome" for Window
import "graphics" for Canvas, Color
import "./turtle" for Turtle
Line 1,195 ⟶ 1,438:
Similar to Quackery image except that the house has a door and a single window.
</pre>
 
=={{header|XPL0}}==
[[File:TurtleXPL0.gif|right]]
<syntaxhighlight lang "XPL0">
def ScrW=320, ScrH=200;
def Pi = 3.141592654;
def D2R = Pi/180.0;
real Dir, PosX, PosY;
int Pen;
def \Pen\ Up, Down;
 
proc Turn(Ang);
real Ang;
Dir:= Dir + Ang*D2R;
 
proc MoveTo(Dist);
real Dist;
[PosX:= PosX + Dist*Cos(Dir);
PosY:= PosY + Dist*Sin(Dir);
if Pen = Down then
Line(ScrW/2+fix(PosX), ScrH/2-fix(PosY), $0F \white\)
else
Move(ScrW/2+fix(PosX), ScrH/2-fix(PosY));
];
 
proc Rectangle(Width, Height);
real Width, Height;
int N;
[for N:= 1 to 2 do
[MoveTo(Width);
Turn(90.0);
MoveTo(Height);
Turn(90.0);
];
];
 
proc BarGraph(List, Len, Size);
real List; int Len; real Size;
int N;
def BarWidth = 0.4;
[for N:= 0 to Len-1 do
[Rectangle(Size*BarWidth, List(N)*Size);
MoveTo(Size*BarWidth);
];
MoveTo(-Size*BarWidth*float(Len));
];
 
proc Triangle(Size);
real Size;
int N;
[for N:= 1 to 3 do
[MoveTo(Size);
Turn(-120.0);
];
];
 
proc Square(Size);
real Size;
Rectangle(Size, Size);
 
proc House(Size);
real Size;
[Turn(180.0);
Square(Size);
Triangle(Size);
Turn(180.0);
];
 
[SetVid($13); \set VGA graphics
Move(ScrW/2, ScrH/2); \start Line at center
Dir:= 0.0; PosX:= 0.0; PosY:= 0.0; Pen:= Down;
House(80.0);
Pen:= Up; MoveTo(10.0); Pen:= Down;
BarGraph([0.5, 1.0/3.0, 2.0, 1.3, 0.5], 5, 45.0);
]</syntaxhighlight>
 
=={{header|Yabasic}}==
3

edits