drawing: use shared band traversal code

This commit is contained in:
Mikolaj Wielgus 2024-07-23 00:02:20 +02:00
parent 61babd179a
commit 95c1c0b8b9
1 changed files with 14 additions and 25 deletions

View File

@ -1,13 +1,11 @@
use crate::{ use crate::{geometry::shape::MeasureLength, graph::MakeRef};
drawing::seg::{LoneLooseSegIndex, SeqLooseSegIndex},
geometry::shape::MeasureLength,
graph::MakeRef,
};
use super::{ use super::{
dot::DotIndex, graph::MakePrimitive,
primitive::{GetJoints, GetOtherJoint}, loose::{GetNextLoose, LooseIndex},
primitive::{GetJoints, GetOtherJoint, MakePrimitiveShape},
rules::AccessRules, rules::AccessRules,
seg::{LoneLooseSegIndex, SeqLooseSegIndex},
Drawing, Drawing,
}; };
@ -42,26 +40,17 @@ impl<'a, CW: Copy, R: AccessRules> MeasureLength for BandRef<'a, CW, R> {
BandFirstSegIndex::Straight(seg) => { BandFirstSegIndex::Straight(seg) => {
self.drawing.geometry().seg_shape(seg.into()).length() self.drawing.geometry().seg_shape(seg.into()).length()
} }
BandFirstSegIndex::Bended(start_seg) => { BandFirstSegIndex::Bended(first_loose_seg) => {
let mut length = self.drawing.geometry().seg_shape(start_seg.into()).length(); let mut maybe_loose: Option<LooseIndex> = Some(first_loose_seg.into());
let start_dot = self.drawing.primitive(start_seg).joints().1; let mut prev = None;
let mut length = 0.0;
let bend = self.drawing.primitive(start_dot).bend(); while let Some(loose) = maybe_loose {
length += self.drawing.geometry().bend_shape(bend.into()).length(); length += loose.primitive(self.drawing).shape().length();
let mut prev_dot = self.drawing.primitive(bend).other_joint(start_dot.into()); let prev_prev = prev;
let mut seg = self.drawing.primitive(prev_dot).seg().unwrap(); prev = maybe_loose;
length += self.drawing.geometry().seg_shape(seg.into()).length(); maybe_loose = self.drawing.loose(loose).next_loose(prev_prev);
while let DotIndex::Loose(dot) =
self.drawing.primitive(seg).other_joint(prev_dot.into())
{
let bend = self.drawing.primitive(dot).bend();
length += self.drawing.geometry().bend_shape(bend.into()).length();
prev_dot = self.drawing.primitive(bend).other_joint(dot);
seg = self.drawing.primitive(prev_dot).seg().unwrap();
length += self.drawing.geometry().seg_shape(seg.into()).length();
} }
length length