mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	Add line_at_angle method to Display component (#6381)
This commit is contained in:
		
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							72c6563a3b
						
					
				
				
					commit
					8fd10d6859
				
			| @@ -36,6 +36,21 @@ void HOT Display::line(int x1, int y1, int x2, int y2, Color color) { | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void Display::line_at_angle(int x, int y, int angle, int length, Color color) { | ||||||
|  |   this->line_at_angle(x, y, angle, 0, length, color); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void Display::line_at_angle(int x, int y, int angle, int start_radius, int stop_radius, Color color) { | ||||||
|  |   // Calculate start and end points | ||||||
|  |   int x1 = (start_radius * cos(angle * M_PI / 180)) + x; | ||||||
|  |   int y1 = (start_radius * sin(angle * M_PI / 180)) + y; | ||||||
|  |   int x2 = (stop_radius * cos(angle * M_PI / 180)) + x; | ||||||
|  |   int y2 = (stop_radius * sin(angle * M_PI / 180)) + y; | ||||||
|  |  | ||||||
|  |   // Draw line | ||||||
|  |   this->line(x1, y1, x2, y2, color); | ||||||
|  | } | ||||||
|  |  | ||||||
| void Display::draw_pixels_at(int x_start, int y_start, int w, int h, const uint8_t *ptr, ColorOrder order, | void Display::draw_pixels_at(int x_start, int y_start, int w, int h, const uint8_t *ptr, ColorOrder order, | ||||||
|                              ColorBitness bitness, bool big_endian, int x_offset, int y_offset, int x_pad) { |                              ColorBitness bitness, bool big_endian, int x_offset, int y_offset, int x_pad) { | ||||||
|   size_t line_stride = x_offset + w + x_pad;  // length of each source line in pixels |   size_t line_stride = x_offset + w + x_pad;  // length of each source line in pixels | ||||||
|   | |||||||
| @@ -258,6 +258,13 @@ class Display : public PollingComponent { | |||||||
|   /// Draw a straight line from the point [x1,y1] to [x2,y2] with the given color. |   /// Draw a straight line from the point [x1,y1] to [x2,y2] with the given color. | ||||||
|   void line(int x1, int y1, int x2, int y2, Color color = COLOR_ON); |   void line(int x1, int y1, int x2, int y2, Color color = COLOR_ON); | ||||||
|  |  | ||||||
|  |   /// Draw a straight line at the given angle based on the origin [x, y] for a specified length with the given color. | ||||||
|  |   void line_at_angle(int x, int y, int angle, int length, Color color = COLOR_ON); | ||||||
|  |  | ||||||
|  |   /// Draw a straight line at the given angle based on the origin [x, y] from a specified start and stop radius with the | ||||||
|  |   /// given color. | ||||||
|  |   void line_at_angle(int x, int y, int angle, int start_radius, int stop_radius, Color color = COLOR_ON); | ||||||
|  |  | ||||||
|   /// Draw a horizontal line from the point [x,y] to [x+width,y] with the given color. |   /// Draw a horizontal line from the point [x,y] to [x+width,y] with the given color. | ||||||
|   void horizontal_line(int x, int y, int width, Color color = COLOR_ON); |   void horizontal_line(int x, int y, int width, Color color = COLOR_ON); | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										35
									
								
								tests/components/display/test.esp32.yaml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								tests/components/display/test.esp32.yaml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | |||||||
|  | spi: | ||||||
|  |   - id: spi_main_lcd | ||||||
|  |     clk_pin: 16 | ||||||
|  |     mosi_pin: 17 | ||||||
|  |     miso_pin: 15 | ||||||
|  |  | ||||||
|  | display: | ||||||
|  |   - platform: ili9xxx | ||||||
|  |     id: main_lcd | ||||||
|  |     model: ili9342 | ||||||
|  |     cs_pin: 12 | ||||||
|  |     dc_pin: 13 | ||||||
|  |     reset_pin: 21 | ||||||
|  |     lambda: |- | ||||||
|  |       // Draw an analog clock in the center of the screen | ||||||
|  |       int centerX = it.get_width() / 2; | ||||||
|  |       int centerY = it.get_height() / 2; | ||||||
|  |       int radius = min(it.get_width(), it.get_height()) / 4; | ||||||
|  |  | ||||||
|  |       // Draw border | ||||||
|  |       it.circle(centerX, centerY, radius); | ||||||
|  |  | ||||||
|  |       // Draw hour ticks | ||||||
|  |       for(int h = 0; h < 12; h++) { | ||||||
|  |         int hourAngle = (h * 30) - 90; | ||||||
|  |  | ||||||
|  |         it.line_at_angle(centerX, centerY, hourAngle, radius - 10, radius); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       // Draw minute ticks | ||||||
|  |       for(int m = 0; m < 60; m++) { | ||||||
|  |         int minuteAngle = (m * 6) - 90; | ||||||
|  |  | ||||||
|  |         it.line_at_angle(centerX, centerY, minuteAngle, radius - 5, radius); | ||||||
|  |       } | ||||||
		Reference in New Issue
	
	Block a user