Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Thick lines moremoremore #12

Draft
wants to merge 188 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
188 commits
Select commit Hold shift + click to select a range
b3acb63
Update to released versions of e-g and simulator
jamwaffles Aug 10, 2021
9e601ee
Crude copypasta thick line
jamwaffles Aug 10, 2021
71eed97
Copypasta thickness compensated
jamwaffles Aug 10, 2021
fcea4fd
Crude port of C demo code
jamwaffles Aug 10, 2021
93bd56d
Different kind of bad width calculation
jamwaffles Aug 10, 2021
93a9af4
Check for overdraw
jamwaffles Aug 10, 2021
ad0bb56
WIP correct centered width
jamwaffles Aug 10, 2021
876e197
Crude but correct balanced width calculation
jamwaffles Aug 11, 2021
6775df4
Line side bias impl
jamwaffles Aug 11, 2021
2fbc56b
Cleanup
jamwaffles Aug 11, 2021
4243be4
All octants but with switching sides
jamwaffles Aug 11, 2021
a9703b0
Fixed left/right side alignment
jamwaffles Aug 11, 2021
8ff0a77
Cleanup
jamwaffles Aug 11, 2021
307789d
Fix single pixel wide jaggies
jamwaffles Aug 11, 2021
5be1aef
Rename demo
jamwaffles Aug 12, 2021
cba9e39
Add circle distance function demo
jamwaffles Aug 12, 2021
1fded40
Line distance field
jamwaffles Aug 12, 2021
6478123
Antialiasing but with some jaggies left
jamwaffles Aug 12, 2021
86ae6e1
More crap
jamwaffles Aug 12, 2021
2b0542e
Smooth fade from center
jamwaffles Aug 18, 2021
c9b2eed
Better antialiasing
jamwaffles Aug 18, 2021
096b5c1
Some experiments with actual width accumulator
jamwaffles Sep 2, 2021
e4a46b9
Move some computation into thick_line()
jamwaffles Sep 2, 2021
2936787
Compute distance from extents
jamwaffles Sep 6, 2021
33f37f3
Half ok AA on one side
jamwaffles Sep 6, 2021
3d06d75
AA on both sides
jamwaffles Sep 6, 2021
5f3d20d
Bit of cleanup
jamwaffles Nov 12, 2021
8194f58
Slightly better, but now we have holes in the middle sometimes
jamwaffles Nov 13, 2021
8c1c0e9
Fix holes
jamwaffles Nov 13, 2021
68ed6bf
Sligtly more optimised side
jamwaffles Nov 13, 2021
d9e67a0
Make other side nicer
jamwaffles Nov 13, 2021
09c72a3
Skip first pixel on left side
jamwaffles Nov 13, 2021
5fc10e1
Autofix some warnings in line-perp
jamwaffles Nov 21, 2021
51dac97
Try decoupling termination detection from colour scaling
jamwaffles Nov 21, 2021
103c675
Only do float scaling at antialiased edge
jamwaffles Nov 21, 2021
05a447b
Right side, cleanup
jamwaffles Nov 21, 2021
2db3398
Add simple 1px wide AA example skeleton
jamwaffles Nov 22, 2021
8bdb115
Floating point bresenham
jamwaffles Nov 22, 2021
6919c5e
One-sided AA using Wu algorithm (kinda)
jamwaffles Nov 27, 2021
7e05502
Simple Bresenham
jamwaffles Nov 27, 2021
48ff80c
Bresenham AA but using floating point
jamwaffles Nov 27, 2021
6e78903
Brightness scaled by 255
jamwaffles Nov 27, 2021
75dd30c
Integer AA using parallel Bresenham
jamwaffles Nov 27, 2021
1a834fd
Above and below demo
jamwaffles Nov 27, 2021
1b577f5
Kinda sorta working parallel integer AA
jamwaffles Nov 28, 2021
7bf8afc
Remove debug logs from perp line
jamwaffles Nov 29, 2021
2274c24
Bresenham thickness, integer
jamwaffles Nov 29, 2021
1fe7d9e
Lots of floating point but nice result
jamwaffles Nov 29, 2021
da252da
AA on one side using FP, again
jamwaffles Dec 23, 2021
ffbc51c
Distance calculation with linear equation and integer sqrt
jamwaffles Dec 23, 2021
bae8080
Use f32 distance calcs to fix innaccuracies
jamwaffles Dec 23, 2021
e0317f6
Big cleanup
jamwaffles Dec 23, 2021
765ee05
Optimise distance algo
jamwaffles Dec 24, 2021
2b8c362
AA without using distance function with sqrt
jamwaffles Dec 26, 2021
0181f6a
Integer antialiasing
jamwaffles Dec 26, 2021
a7693de
Broken but consistent edge independent of thickness
jamwaffles Dec 27, 2021
66f99ec
Back to fractions, kiiiinda working independent of thickness though
jamwaffles Dec 27, 2021
ca4aa8c
Looks like (63, 91) from prev screenshot but... WHY 1.5???
jamwaffles Dec 27, 2021
da41e92
Pretty much working?
jamwaffles Dec 27, 2021
c82d920
Cleanup
jamwaffles Dec 28, 2021
37d5df4
Improved parallel Wu algo
jamwaffles Dec 28, 2021
3b81555
Add slower but more stable line distance function
jamwaffles Dec 29, 2021
267d7ea
IDEFK lmao
jamwaffles Dec 29, 2021
4830f2b
Replace Wu demo with... a worse one?
jamwaffles Dec 29, 2021
5b5d18a
Wu AA, again, slightly better this time
jamwaffles Dec 30, 2021
6048099
Bit more Wu debugging
jamwaffles Dec 30, 2021
2ce0bf2
Use half rate error accum
jamwaffles Dec 30, 2021
61cc3f8
Change example to draw pixel pairs
jamwaffles May 22, 2022
0aeeaf1
Very crude some-octant AA
jamwaffles May 22, 2022
c7d7237
Add no-AA parallel line
jamwaffles Nov 30, 2022
6bff3e6
WIP: In-phase parallel lines for some octants
jamwaffles Dec 6, 2022
7a16787
WIP: Attempting to draw extra step lines
jamwaffles Dec 6, 2022
afd3b5c
WIP: Draw extra lines, but with some bugs around 45º
jamwaffles Dec 7, 2022
cab035f
WIP: Correct extra line drawing, but broken width/offset
jamwaffles Dec 7, 2022
6ca78e7
WIP: Fix line width calculation using integers
jamwaffles Dec 7, 2022
e613fd8
WIP: Correct line offset
jamwaffles Dec 7, 2022
f42cdeb
WIP: Draw legit line below new one
jamwaffles Dec 7, 2022
15fe073
WIP: Walk line out on alternating sides
jamwaffles Dec 12, 2022
20e693c
Improve some variable names
jamwaffles Dec 12, 2022
e7f8a14
Minor cleanup
jamwaffles Dec 12, 2022
c6cbb2d
Fix extra line skip/length offset
jamwaffles Dec 12, 2022
c029e34
Cleanup
jamwaffles Dec 13, 2022
16835b1
Remove weird "idk" variable
jamwaffles Dec 13, 2022
4549d82
Start simplifying extra lines
jamwaffles Dec 14, 2022
6a6e3e9
Reintroduce correctly phased extra lines
jamwaffles Dec 14, 2022
4aa04c2
Correct line algorithm!
jamwaffles Dec 14, 2022
7372cab
Configurable last offset
jamwaffles Dec 14, 2022
f4758ad
Basic single-side AA
jamwaffles Dec 15, 2022
f874e17
WIP AA
jamwaffles Dec 15, 2022
4e06026
Fix(?) weirdnesses around gradients = 1
jamwaffles Dec 15, 2022
5377cf8
AA tweaks
jamwaffles Dec 15, 2022
806b840
Integer-only AA!
jamwaffles Dec 15, 2022
2b41e77
Fix AA for broken octants
jamwaffles Dec 15, 2022
870156d
Fix some old examples
jamwaffles Dec 15, 2022
798e691
Bump sim version for local use
jamwaffles Dec 15, 2022
484308e
Fix start brightness for AA line
jamwaffles Dec 18, 2022
003ac5e
Compute delta inside AA function
jamwaffles Dec 18, 2022
095c9ef
Fix some fireflies
jamwaffles Dec 18, 2022
b090659
Add another toggle var for debugging
jamwaffles Dec 18, 2022
8fedc36
Cleanup
jamwaffles Dec 18, 2022
48609ac
Nearly working both sides AA
jamwaffles Dec 18, 2022
a923997
Simplify AA thickness check
jamwaffles Dec 18, 2022
73c0bda
Final threshold fiddling
jamwaffles Dec 21, 2022
8d09b71
Fix right-side final holes
jamwaffles Jan 7, 2023
5b7dbb4
Reinstate AA
jamwaffles Jan 7, 2023
ca6397f
Sort of make 1px wide lines work
jamwaffles Jan 7, 2023
b8f7f5c
Add a note
jamwaffles Jan 7, 2023
9669879
Simplify last edge drawing a bit
jamwaffles Jan 15, 2023
b4356ad
Debugging AA using floating point
jamwaffles Jan 19, 2023
fdc60d9
More FP debugging
jamwaffles Jan 19, 2023
1ae37c2
Make AA sort of work with just Bresenham vars
jamwaffles Jan 22, 2023
ba5f219
Some stuff from a very long time ago
jamwaffles Jun 30, 2024
720ec11
Glitchy but decent looking 256 mul AA
jamwaffles Jun 30, 2024
4e346e0
Kinda correctly scaled positions
jamwaffles Jun 30, 2024
cd4106b
Debugging incorrect phasing for AA edge
jamwaffles Jun 30, 2024
85ae963
Smaller debug tool to test thick line seed * 256
jamwaffles Jun 30, 2024
99e1e7b
Start again again again
jamwaffles Jun 30, 2024
67be67a
Single sided seed line
jamwaffles Jun 30, 2024
a298784
Correctly calculate X/Y major when multiplying Y values
jamwaffles Jun 30, 2024
b31d014
Threshold seems to be miscalculated
jamwaffles Jun 30, 2024
57ec6d9
Make threshold work by using non-mul line delta
jamwaffles Jun 30, 2024
f54c2f7
Tweak some defaults
jamwaffles Jun 30, 2024
d853ba3
Get everything working with *256
jamwaffles Jun 30, 2024
d44f545
Add AA pixel drawing code
jamwaffles Jun 30, 2024
a36b64d
Use multiplied slope as Y coordinate increment
jamwaffles Jun 30, 2024
bcb3548
Make things work in X-major octants
jamwaffles Jun 30, 2024
6f8ca4a
Big hacks to get things working in X-major octants
jamwaffles Jun 30, 2024
72d7d8f
Switch over to seed line
jamwaffles Jun 30, 2024
1339d31
Add parallel lines, but with broken starting error value
jamwaffles Jun 30, 2024
68ac77f
Do a whole bunch of mul by 256
jamwaffles Jul 12, 2024
8cbafdc
Make stuff work again
jamwaffles Jul 12, 2024
23dee74
Correct start error offset calculation
jamwaffles Jul 12, 2024
81fa44b
Minor cleanup
jamwaffles Jul 12, 2024
19bac1c
WIP I forgot what I was doing
jamwaffles Jul 13, 2024
cc46f59
Fix flipped octant line phasing
jamwaffles Aug 17, 2024
413ee55
Disable a bunch of debug prints
jamwaffles Aug 17, 2024
ff66ec9
Draw non-AA final line with correct phasing
jamwaffles Aug 17, 2024
3a8de9c
Reuse AA function to draw thick line in phase with AA
jamwaffles Aug 17, 2024
5f364c9
Don't recalculate parallel step/delta in line function
jamwaffles Aug 18, 2024
ff5cd42
Mul 256 seed line (doesn't work very well)
jamwaffles Aug 18, 2024
6ef4eb8
Revert "Mul 256 seed line (doesn't work very well)"
jamwaffles Aug 18, 2024
61ce78a
Something kind of working with separate parallel start point!
jamwaffles Aug 18, 2024
97768c3
Revert "Something kind of working with separate parallel start point!"
jamwaffles Aug 18, 2024
f0cfd2e
Add `extra` param
jamwaffles Aug 18, 2024
e6dd4f1
Somewhat slightly working start error offset
jamwaffles Aug 18, 2024
295f1bd
Correct phasing without needing extra lines, but only in some octants
jamwaffles Aug 18, 2024
f3b01ae
Draw lien with existing algo to double check
jamwaffles Aug 18, 2024
ca97820
Wahey it friggin works! (with f32 colour blend)
jamwaffles Aug 18, 2024
d06bf16
Enormous cleanup
jamwaffles Aug 19, 2024
3d8cf6c
Get rid of `point`
jamwaffles Aug 19, 2024
118ad09
Add proper LERP for AA pixel colour
jamwaffles Aug 19, 2024
8e31f15
Break phasing, but make all octants work
jamwaffles Aug 19, 2024
612fc4c
Correct in all octants but with missing extra lines
jamwaffles Aug 19, 2024
f539c33
Revert "Correct in all octants but with missing extra lines"
jamwaffles Aug 19, 2024
3a50ce1
Use slope to make all quadrants correct (but phase is still broken)
jamwaffles Aug 19, 2024
960afa0
Kinda start again
jamwaffles Aug 19, 2024
7a10254
Back to fully missing lines
jamwaffles Aug 19, 2024
bcb2adb
Sort of make extra line fill work
jamwaffles Aug 19, 2024
9ae97e7
Check limit for extra lines too
jamwaffles Aug 19, 2024
8b46627
Note
jamwaffles Aug 19, 2024
c64b98d
Working again, with extra line
jamwaffles Aug 19, 2024
8187cc3
Clean a few things up, add some comments
jamwaffles Aug 20, 2024
5145e5e
Correct AA direction for all octants
jamwaffles Aug 20, 2024
f10b669
Huge cleanup
jamwaffles Aug 20, 2024
3020e7e
More cleanup
jamwaffles Aug 20, 2024
3ccbe62
Do fewer `abs()` calls
jamwaffles Aug 20, 2024
8b98763
AA on other edge of line too
jamwaffles Aug 20, 2024
e3cd41c
Non-conditional
jamwaffles Aug 20, 2024
834f2ee
Draw parallel seed line ready for AA
jamwaffles Aug 21, 2024
4cf6617
Add configurable phase and broken naive AA algo
jamwaffles Aug 21, 2024
a329b70
Get rid of `mul_point2`
jamwaffles Aug 26, 2024
8ba4b52
Draw seed line
jamwaffles Aug 26, 2024
f5e6b93
Draw AA pixels on seed line
jamwaffles Aug 26, 2024
3869a08
Go back to just integers and no multiplication
jamwaffles Nov 29, 2024
804c3c3
Revert "Go back to just integers and no multiplication"
jamwaffles Nov 29, 2024
5816164
Extremely hacky correct step
jamwaffles Nov 29, 2024
fceacc0
Tweaks to start debugging parallel initial error
jamwaffles Nov 29, 2024
4b82812
Slightly closer to correct parallel line phasing
jamwaffles Nov 29, 2024
eba5ebf
Correct parallel line phasing
jamwaffles Nov 29, 2024
442da30
Add example that muls both axes by 256
jamwaffles Dec 5, 2024
f88a0cf
Use line slope for seed step
jamwaffles Dec 5, 2024
931b10f
Draw parallel lines using multiplied coords
jamwaffles Dec 5, 2024
8442de3
Start drawing parallel AA line
jamwaffles Dec 5, 2024
eea83fd
Fix slope calculation
jamwaffles Dec 5, 2024
873c998
HELL YEAH in phase parallel edge AA!
jamwaffles Dec 5, 2024
ab4aca2
Starting edge AA too
jamwaffles Dec 5, 2024
6e7bb5b
Make AA lines hug rest
jamwaffles Dec 5, 2024
096dc31
Declare parallel Bresenham stuff outside loop
jamwaffles Dec 5, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,4 @@ members = [
]

[patch.crates-io]
embedded-graphics = { git = "https://github.com/embedded-graphics/embedded-graphics.git"}
embedded-graphics-simulator = { git = "https://github.com/embedded-graphics/simulator.git"}
embedded-graphics = { path = "../embedded-graphics" }
5 changes: 3 additions & 2 deletions debug-tools/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@ publish = false

[dependencies]
framework = { path = "../framework" }
embedded-graphics = "0.7.0-beta.2"
embedded-graphics-simulator = "0.3.0-alpha.2"
embedded-graphics = { version = "0.8.1", path = "../../embedded-graphics" }
embedded-graphics-simulator = { version = "0.6.0", path = "../../simulator" }
integer-sqrt = "0.1.5"
136 changes: 136 additions & 0 deletions debug-tools/examples/aa-bres-float.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
//! Render a 1px wide antialiased line using error components and a 255 multiplier.
//!
//! Inspiration from <https://computergraphics.stackexchange.com/a/10675>

use core::convert::TryFrom;
use embedded_graphics::{
mock_display::MockDisplay, pixelcolor::Rgb888, prelude::*, primitives::Line,
};
use embedded_graphics_simulator::{OutputSettingsBuilder, SimulatorDisplay, Window};
use framework::prelude::*;

fn thick_line(
display: &mut impl DrawTarget<Color = Rgb888, Error = std::convert::Infallible>,
line: Line,
_width: i32,
) -> Result<(), std::convert::Infallible> {
let skele_color = Rgb888::MAGENTA;

let delta = line.delta();

let dx = delta.x;
let dy = delta.y;

let mut point = line.start;
let mut error: f32 = 0.0;
let slope = dy as f32 / dx as f32;

println!("---");

for _i in 0..=dx {
// // AA point above
let bright = ((0.5 - error).abs() * 256.0) as u32;
let c = Rgb888::new(
((bright * skele_color.r() as u32) / 255) as u8,
((bright * skele_color.g() as u32) / 255) as u8,
((bright * skele_color.b() as u32) / 255) as u8,
);
Pixel(Point::new(point.x, point.y - 1), c).draw(display)?;

// // AA point below
// let bright = (255 - br) as u32;
// let c = Rgb888::new(
// ((bright * skele_color.r() as u32) / 255) as u8,
// ((bright * skele_color.g() as u32) / 255) as u8,
// ((bright * skele_color.b() as u32) / 255) as u8,
// );
// Pixel(Point::new(point.x, point.y + 1), c).draw(display)?;

// Line skeleton
let bright = 255;
let c = Rgb888::new(
((bright * skele_color.r() as u32) / 255) as u8,
((bright * skele_color.g() as u32) / 255) as u8,
((bright * skele_color.b() as u32) / 255) as u8,
);
Pixel(Point::new(point.x, point.y), c).draw(display)?;

dbg!(error);

if error > 0.5 {
point.y += 1;
error -= 1.0;
}

error += slope;
point.x += 1;
}

Ok(())
}

struct LineDebug {
start: Point,
end: Point,
stroke_width: u32,
}

impl App for LineDebug {
type Color = Rgb888;
const DISPLAY_SIZE: Size = Size::new(200, 200);
// const DISPLAY_SIZE: Size = Size::new(64, 64);

fn new() -> Self {
let end = Point::new(
Self::DISPLAY_SIZE.width as i32 / 2,
Self::DISPLAY_SIZE.height as i32 / 2,
);
Self {
start: end + Point::new(10, 15),
end,
// end: start + Point::new(100, 0),
stroke_width: 10,
}
}

fn parameters(&mut self) -> Vec<Parameter> {
vec![
Parameter::new("start", &mut self.start),
Parameter::new("end", &mut self.end),
Parameter::new("stroke", &mut self.stroke_width),
]
}

fn draw(
&self,
display: &mut SimulatorDisplay<Self::Color>,
) -> Result<(), std::convert::Infallible> {
let Point { x: _x0, y: _y0 } = self.start;

// let width = 2 * self.stroke_width as i32 * f32::sqrt((dx * dx + dy * dy) as f32) as i32;
// let width = (self.stroke_width as i32).pow(2) * (dx * dx + dy * dy);
let width = self.stroke_width as i32;

let _mock_display: MockDisplay<Rgb888> = MockDisplay::new();

thick_line(display, Line::new(self.start, self.end), width)?;

// let l = Line::new(self.start, self.end);

// l.into_styled(PrimitiveStyle::with_stroke(Rgb888::GREEN, 1))
// .draw(&mut display.translated(Point::new(40, 40)))?;

// l.perpendicular()
// .into_styled(PrimitiveStyle::with_stroke(Rgb888::RED, 1))
// .draw(&mut display.translated(Point::new(40, 40)))?;

Ok(())
}
}

fn main() {
let settings = OutputSettingsBuilder::new().scale(5).build();
let window = Window::new("Line debugger", &settings);

LineDebug::run(window);
}
160 changes: 160 additions & 0 deletions debug-tools/examples/aa-bres.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
//! Render a 1px wide antialiased line using error components and a 255 multiplier.
//!
//! Inspiration from <https://computergraphics.stackexchange.com/a/10675>

use core::convert::TryFrom;
use embedded_graphics::{
mock_display::MockDisplay, pixelcolor::Rgb888, prelude::*, primitives::Line,
};
use embedded_graphics_simulator::{OutputSettingsBuilder, SimulatorDisplay, Window};
use framework::prelude::*;

fn thick_line(
display: &mut impl DrawTarget<Color = Rgb888, Error = std::convert::Infallible>,
line: Line,
_width: i32,
) -> Result<(), std::convert::Infallible> {
let skele_color = Rgb888::MAGENTA;

let delta = line.delta();

let dx = delta.x;
let dy = delta.y;

let num = dy * 255;
let denom = dx;
// Rounding integer division
let slope = ((num) + (denom) / 2) / (denom);

let slope = if let Ok(slope) = u8::try_from(slope) {
slope
} else {
// Most likely cause: gradient is incorrect due to improper swapping of major/minor
// direction. The slope should always be 1.0 or less, or because we multiply by 255 in this
// case, 255 or less.
return Ok(());
};

let mut point = line.start;

let mut error: i32 = 0;

let threshold = dx - 2 * dy;
// E_diag
let e_minor = -2 * dx;
// E_square
let e_major = 2 * dy;

// TODO: Calculate initial brightness
let mut br: u8 = 255;
dbg!(slope);

for _i in 0..=dx {
// println!("{} {}", br, error);
// AA point above
let bright = br as u32;
let c = Rgb888::new(
((bright * skele_color.r() as u32) / 255) as u8,
((bright * skele_color.g() as u32) / 255) as u8,
((bright * skele_color.b() as u32) / 255) as u8,
);
Pixel(Point::new(point.x, point.y - 1), c).draw(display)?;

// // AA point below
// let bright = (255 - br) as u32;
// let c = Rgb888::new(
// ((bright * skele_color.r() as u32) / 255) as u8,
// ((bright * skele_color.g() as u32) / 255) as u8,
// ((bright * skele_color.b() as u32) / 255) as u8,
// );
// Pixel(Point::new(point.x, point.y + 1), c).draw(display)?;

// Line skeleton
// let bright = (e * 255.0) as u32;
let bright = 255;
let c = Rgb888::new(
((bright * skele_color.r() as u32) / 255) as u8,
((bright * skele_color.g() as u32) / 255) as u8,
((bright * skele_color.b() as u32) / 255) as u8,
);
Pixel(Point::new(point.x, point.y), c).draw(display)?;

if error > threshold {
point.y += 1;
error += e_minor;
br = 255;
}

error += e_major;
point.x += 1;
br = br.saturating_sub(slope);
}

Ok(())
}

struct LineDebug {
start: Point,
end: Point,
stroke_width: u32,
}

impl App for LineDebug {
type Color = Rgb888;
const DISPLAY_SIZE: Size = Size::new(200, 200);
// const DISPLAY_SIZE: Size = Size::new(64, 64);

fn new() -> Self {
let end = Point::new(
Self::DISPLAY_SIZE.width as i32 / 2,
Self::DISPLAY_SIZE.height as i32 / 2,
);
Self {
start: end + Point::new(10, 15),
end,
// end: start + Point::new(100, 0),
stroke_width: 10,
}
}

fn parameters(&mut self) -> Vec<Parameter> {
vec![
Parameter::new("start", &mut self.start),
Parameter::new("end", &mut self.end),
Parameter::new("stroke", &mut self.stroke_width),
]
}

fn draw(
&self,
display: &mut SimulatorDisplay<Self::Color>,
) -> Result<(), std::convert::Infallible> {
let Point { x: _x0, y: _y0 } = self.start;

// let width = 2 * self.stroke_width as i32 * f32::sqrt((dx * dx + dy * dy) as f32) as i32;
// let width = (self.stroke_width as i32).pow(2) * (dx * dx + dy * dy);
let width = self.stroke_width as i32;

let _mock_display: MockDisplay<Rgb888> = MockDisplay::new();

thick_line(display, Line::new(self.start, self.end), width)?;

// let l = Line::new(self.start, self.end);

// l.into_styled(PrimitiveStyle::with_stroke(Rgb888::GREEN, 1))
// .draw(&mut display.translated(Point::new(40, 40)))?;

// l.perpendicular()
// .into_styled(PrimitiveStyle::with_stroke(Rgb888::RED, 1))
// .draw(&mut display.translated(Point::new(40, 40)))?;

Ok(())
}
}

fn main() {
let settings = OutputSettingsBuilder::new().scale(5).build();
let window = Window::new("Line debugger", &settings);

LineDebug::run(window);
}
Loading