MCPcopy Create free account
hub / github.com/donkeyteethUX/iced_plot / draw_styled_line_segment

Function draw_styled_line_segment

src/plot_renderer/canvas.rs:463–523  ·  view source on GitHub ↗
(
    frame: &mut Frame,
    p0: iced::Point,
    p1: iced::Point,
    line_type: LineType,
    width: f32,
    color: Color,
    phase_start: f32,
)

Source from the content-addressed store, hash-verified

461}
462
463fn draw_styled_line_segment(
464 frame: &mut Frame,
465 p0: iced::Point,
466 p1: iced::Point,
467 line_type: LineType,
468 width: f32,
469 color: Color,
470 phase_start: f32,
471) {
472 let delta = iced::Vector::new(p1.x - p0.x, p1.y - p0.y);
473 let length = (delta.x * delta.x + delta.y * delta.y).sqrt();
474 if length <= f32::EPSILON {
475 return;
476 }
477
478 let direction = iced::Vector::new(delta.x / length, delta.y / length);
479
480 match line_type {
481 LineType::Solid => stroke_segment(frame, p0, p1, width, color),
482 LineType::Dashed { length: dash } => {
483 let dash = dash.max(1.0);
484 let gap = (dash * 0.5).max(1.0);
485 let pattern = dash + gap;
486 let mut pattern_start = -(phase_start.rem_euclid(pattern));
487 while pattern_start < length {
488 let seg_start = pattern_start.max(0.0);
489 let seg_end = (pattern_start + dash).min(length);
490 if seg_end > seg_start {
491 let start = iced::Point::new(
492 p0.x + direction.x * seg_start,
493 p0.y + direction.y * seg_start,
494 );
495 let end = iced::Point::new(
496 p0.x + direction.x * seg_end,
497 p0.y + direction.y * seg_end,
498 );
499 stroke_segment(frame, start, end, width, color);
500 }
501 pattern_start += pattern;
502 }
503 }
504 LineType::Dotted { spacing } => {
505 let spacing = spacing.max(1.0);
506 let step = spacing * 2.0;
507 let radius = width.max(1.5) * 0.5;
508 let remainder = phase_start.rem_euclid(step);
509 let mut offset = if remainder <= f32::EPSILON {
510 0.0
511 } else {
512 step - remainder
513 };
514 while offset <= length {
515 let center =
516 iced::Point::new(p0.x + direction.x * offset, p0.y + direction.y * offset);
517 let dot = canvas::Path::circle(center, radius);
518 frame.fill(&dot, color);
519 offset += step;
520 }

Callers 2

draw_linesFunction · 0.85
draw_reference_linesFunction · 0.85

Calls 2

stroke_segmentFunction · 0.85
newFunction · 0.50

Tested by

no test coverage detected