squircle
This commit is contained in:
		
							parent
							
								
									ed8f12e179
								
							
						
					
					
						commit
						eb6207e119
					
				
					 1 changed files with 75 additions and 0 deletions
				
			
		
							
								
								
									
										75
									
								
								src/main.rs
									
										
									
									
									
								
							
							
						
						
									
										75
									
								
								src/main.rs
									
										
									
									
									
								
							| 
						 | 
					@ -119,6 +119,80 @@ impl Drawable for BouncingImage {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct Circle {
 | 
				
			||||||
 | 
					   x: u32,
 | 
				
			||||||
 | 
					   y: u32,
 | 
				
			||||||
 | 
					   radius: i32
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					impl Circle {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn new(x:u32, y: u32,radius:i32) -> Self {
 | 
				
			||||||
 | 
					        Circle {
 | 
				
			||||||
 | 
					         x,
 | 
				
			||||||
 | 
					         y,
 | 
				
			||||||
 | 
					         radius   
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }    
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// This exploits the eight-way symmetry of a circle.
 | 
				
			||||||
 | 
					    fn draw_circle_octants(&mut self, display: &mut Display, cx: u16, cy: u16, x: u16, y: u16, r: u8, g: u8, b: u8) {
 | 
				
			||||||
 | 
					        display.set_pixel(cx + x, cy + y, r, g, b);
 | 
				
			||||||
 | 
					        display.set_pixel(cx - x, cy + y, r, g, b);
 | 
				
			||||||
 | 
					        display.set_pixel(cx + x, cy - y, r, g, b);
 | 
				
			||||||
 | 
					        display.set_pixel(cx - x, cy - y, r, g, b);
 | 
				
			||||||
 | 
					        display.set_pixel(cx + y, cy + x, r, g, b);
 | 
				
			||||||
 | 
					        display.set_pixel(cx - y, cy + x, r, g, b);
 | 
				
			||||||
 | 
					        display.set_pixel(cx + y, cy - x, r, g, b);
 | 
				
			||||||
 | 
					        display.set_pixel(cx - y, cy - x, r, g, b);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /// Draws a circle using the Midpoint Circle Algorithm.
 | 
				
			||||||
 | 
					    ///
 | 
				
			||||||
 | 
					    /// # Arguments
 | 
				
			||||||
 | 
					    /// * `center_x`: The x-coordinate of the circle's center.
 | 
				
			||||||
 | 
					    /// * `center_y`: The y-coordinate of the circle's center.
 | 
				
			||||||
 | 
					    /// * `radius`: The radius of the circle. Must be non-negative.
 | 
				
			||||||
 | 
					    /// * `r`, `g`, `b`: The RGB color components for the circle.
 | 
				
			||||||
 | 
					    pub fn draw_circle(&mut self, display: &mut Display, center_x: u32, center_y: u32, radius: i32, r: u8, g: u8, b: u8) {
 | 
				
			||||||
 | 
					        if radius < 0 {
 | 
				
			||||||
 | 
					            // Or return an error: Err("Radius cannot be negative".into())
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let mut x = 0;
 | 
				
			||||||
 | 
					        let mut y = radius;
 | 
				
			||||||
 | 
					        // Initial decision parameter
 | 
				
			||||||
 | 
					        let mut d = 3 - 2 * radius;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Iterate through the first octant and draw points in all 8 octants
 | 
				
			||||||
 | 
					        while y >= x {
 | 
				
			||||||
 | 
					            self.draw_circle_octants(display,center_x.try_into().unwrap(), center_y.try_into().unwrap(), x.try_into().unwrap(), y.try_into().unwrap(), r, g, b);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            x += 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // Update the decision parameter
 | 
				
			||||||
 | 
					            if d > 0 {
 | 
				
			||||||
 | 
					                y -= 1;
 | 
				
			||||||
 | 
					                d = d + 4 * (x - y) + 10;
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                d = d + 4 * x + 6;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					impl Drawable for Circle {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    fn rate(&self) -> u32 {
 | 
				
			||||||
 | 
					        1
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					       /// Helper method to draw the 8 symmetric points for a given (x, y) offset.
 | 
				
			||||||
 | 
					    fn draw_and_move(&mut self, display: &mut Display) {
 | 
				
			||||||
 | 
					     self.draw_circle(display,self.x,self.y,self.radius,255,255,255);   
 | 
				
			||||||
 | 
					    }   
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Manages the connection and data sent to the display.
 | 
					/// Manages the connection and data sent to the display.
 | 
				
			||||||
struct Display {
 | 
					struct Display {
 | 
				
			||||||
    socket: UdpSocket,
 | 
					    socket: UdpSocket,
 | 
				
			||||||
| 
						 | 
					@ -202,6 +276,7 @@ fn main() {
 | 
				
			||||||
        Box::new(BouncingImage::new("images/spade.png", 32, -12, 1, 0, 0)),
 | 
					        Box::new(BouncingImage::new("images/spade.png", 32, -12, 1, 0, 0)),
 | 
				
			||||||
        Box::new(BouncingImage::new("images/dvdvideo.png", 20, 6, 5, 1000, 800)),
 | 
					        Box::new(BouncingImage::new("images/dvdvideo.png", 20, 6, 5, 1000, 800)),
 | 
				
			||||||
        Box::new(BouncingImage::new("images/hackaday.png", 40, 18, 3, 500, 800)),
 | 
					        Box::new(BouncingImage::new("images/hackaday.png", 40, 18, 3, 500, 800)),
 | 
				
			||||||
 | 
					        Box::new(Circle::new(1920/2,1080/2,128))
 | 
				
			||||||
    ];
 | 
					    ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let mut display = Display::new(DISPLAY_HOST, DISPLAY_PORT);
 | 
					    let mut display = Display::new(DISPLAY_HOST, DISPLAY_PORT);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue