fn remove_obtuse_angle()

in src/ras.rs [556:605]


fn remove_obtuse_angle(outline: &Outline) -> Outline {
    let mut segments: Vec<Segment> = vec![];
    let mut head_index: usize = 0;
    for contour in outline.contours() {
        for (index, segment) in contour
            .iter(ContourIterFlags::IGNORE_CLOSE_SEGMENT)
            .enumerate()
        {
            if index == 0 {
                head_index = segments.len();
                segments.push(Segment {
                    baseline: segment.baseline,
                    ctrl: segment.ctrl,
                    kind: SegmentKind::None,
                    flags: SegmentFlags::FIRST_IN_SUBPATH,
                });
            }
            let from = segment.baseline.from();
            let to = segment.baseline.to();
            if segment.is_quadratic() {
                let ctrl = segment.ctrl.from();
                let d = segment.baseline.square_length().sqrt();
                let d1 = calc_distance(ctrl, from);
                let d2 = calc_distance(ctrl, to);
                if d1 <= 10.0 || d2 <= 10.0 {
                    let mut cos = (d1 * d1 + d * d - d2 * d2) / 2.0 * d1 * d;
                    if cos > 0.0 {
                        cos = (d2 * d2 + d * d - d1 * d1) / 2.0 * d2 * d;
                    }
                    if cos <= 0.0 {
                        segments.push(Segment::line(LineSegment2F::new(from, to)));
                        continue;
                    }
                }
            }
            if segment.is_cubic() {
                // TODO
            }
            segments.push(segment)
        }
        let mut last_seg = segments.last().unwrap().clone();
        let first_seg_pos = segments[head_index].baseline.from();
        if last_seg.kind == SegmentKind::Line && first_seg_pos == last_seg.baseline.to() {
            segments.pop();
        }
        last_seg.flags = SegmentFlags::CLOSES_SUBPATH;
        segments.push(last_seg);
    }
    Outline::from_segments(segments.into_iter())
}