From 8b47d9904ead018ad4222c5a400631df72326cc6 Mon Sep 17 00:00:00 2001 From: serr Date: Wed, 25 Jun 2025 14:41:20 +0300 Subject: [PATCH] right and forward --- output.png | Bin 12251 -> 2534 bytes src/main.rs | 12 +++++++++++- src/turtle.rs | 49 ++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 49 insertions(+), 12 deletions(-) diff --git a/output.png b/output.png index 41d30f6e5e6b74fe2c92eb8df30e3a957ee39b51..e8381c982966ee9ed0d0a400385cf5493609608a 100644 GIT binary patch literal 2534 zcmeAS@N?(olHy`uVBq!ia0y~yVAKI&4kn<;H+e}V1_sWxo-U3d6^w5WFfUMvoObNv z|MGXeC(bM{@=jitdwUxcW%kUQ=CyvFk+IUdpJm&#s+P4|XJ1`^>)EQ+>we`kIy?o@ z@0mvF(Qp_|2PpaA|5KHZ_LFkgRXt=_5%YEb{M>)-6OV-cS7Oi#k1f4gFFr~SSUCKB zuim-(pE=WlqO1Rlw(WdXuQ?hS0~Q&hnPIdr7%dD5RSN$EU49Czi+|d_71(}b@O1Ta JS?83{1OUdBUL^nk literal 12251 zcmeI2Z%kWd6vhkdTmzd@G@^5)rA%>)TCzonGqW;bfQw8Gge-$}#*wLW%3PF%s27_> zMsyO1K=y^IiDGEhsw9lfkW$@0WwV(JK_#ZdMHeA%7<0oFX^-ax2Iu+i7n3&uLe72e z?ejkOyytgYXnmrxY*ohU44ciis-nE)DVuGXTYWpyxl)z=p3i3UepFFXTy-$*kD+BB ztliOh=1*$8dgR>so|m^h6W%x0zwq_kJKdd+MY=a^^j!V>)#J}MebVyK-jT>pzx9T~ zCnx5AP+`^L@1gKaTgk8TV7WfnOFD#!|3L^-zV@|Cot&!iSgvpSWo0_g3VsWft~|?i z9x6qwxd4?>x8;gMrO|CAhM#w zt2moy`G-NXC(laYDps)OJJ9s7XIw>@+w#Rg^N(}Z|Mbr6nz~m;s^@;t1xMt3Ec8dN8>D(5eX|!`gta=w*Ce0B(iMMZ%D?zaHWmc_e zgGIbl)-ZD53;F6sejwD{0;lcd(`F%`=;~Otw;4o}EDC_@XgZ7Dm!iQ>9pRZSxYFB) z#(Q(#l%nLYBiwWmMA2pz9hIWNLVHbeFNiWr8b+e+QncA%(Ij~KtC&TtASw!kQpX_N z2YD&iAl>*@J`HZ|=9^>H^rFmi`6CS@hFvy9V7!;yLXtE%ZDWm)r2P2<6F!*{8O~bM zC0m$!IJE834wdn`uE-XqTwcT_5r;{c?C+>p){MbP({8ZCVHgjC9rwUQ^pJ>$rr8b* z9JI)uGL=ToQTkbFPKmiir18P+oSjB#&ku;zkN&~AX zRvJkITBkIy3MW^92J{BE2GGFR$gKf1h^p3*G%yoyacf8#%v|G61sWuaxKn`!sStN6 z(11Qxb|Cmo%8sOg;bc2N12wgP24?VGwj*gU6E9^uk_O2F58IJ6NcC~20uAQ!0vgak zwgWUU3Y8s6179}Vku)$}Dji9KnKn)bXkgd^3|o2o46mw48qj@qW~!t?a?Hsj1sWuH zlOhf1R&|=Bff?c9h%_M1xejPxMtC|R4ZQ2w641c(@P0=c&;}L(4NNcJd8C1NWvm)$ zV5Y0301e_UC6Y8SU&~S=NrU(iUN6v~=|;5_ph4fw`K3)gQVObO`f< zL3e`g1lQ2y|pgZCEpZE1(R7vQWphM6z zLC*yJsk;6^S, Vec>; type Colour = Rgb; type Coord = (i32, i32); -const DEFAULT_WIDTH: u32 = 800; -const DEFAULT_HEIGHT: u32 = 800; +const DEFAULT_WIDTH: u32 = 300; +const DEFAULT_HEIGHT: u32 = 300; const DEFAULT_BACKGROUND_COLOUR: Colour = Rgb([255u8, 255u8, 255u8]); const DEFAULT_COLOUR: Colour = Rgb([0u8, 0u8, 0u8]); +const DEFAULT_POS: Coord = ((DEFAULT_WIDTH as f64/2.0) as i32, (DEFAULT_HEIGHT as f64/2.0) as i32); pub struct Turtle { buf: ImgBufU8, colour: Colour, pos: Coord, - angle: f64, + step_length: u32, + angle: f64, // угол в радианах } impl Turtle { @@ -30,7 +32,8 @@ impl Turtle { Turtle { buf, colour: DEFAULT_COLOUR, - pos: (0, 0), + pos: DEFAULT_POS, + step_length: 10, angle: 0.0, } } @@ -39,13 +42,28 @@ impl Turtle { self.pos } - pub fn draw_line(&mut self, start: Coord, end: Coord) { - drawing::draw_line_segment_mut( - &mut self.buf, - (start.0 as f32, start.1 as f32), - (end.0 as f32, end.1 as f32), - self.colour - ); + pub fn angle(&self) -> f64 { + self.angle.to_degrees() + } + + pub fn forward(&mut self, steps_count: u32) { + let start_pos = self.pos; + + let dy = self.angle.sin() * steps_count as f64 * self.step_length as f64; + let dx = self.angle.cos() * steps_count as f64 * self.step_length as f64; + + self.pos.0 += dx.round() as i32; + self.pos.1 += dy.round() as i32; + + self.draw_line(start_pos, self.pos); + } + + pub fn right(&mut self, degrees: f64) { + self.angle += degrees.to_radians(); + } + + pub fn left(&mut self, degrees: f64) { + self.angle -= degrees.to_radians(); } pub fn save

(&self, output_path: P) -> ImageResult<()> @@ -54,4 +72,13 @@ impl Turtle { { self.buf.save(output_path) } + + fn draw_line(&mut self, start: Coord, end: Coord) { + drawing::draw_line_segment_mut( + &mut self.buf, + (start.0 as f32, start.1 as f32), + (end.0 as f32, end.1 as f32), + self.colour + ); + } } \ No newline at end of file