mirror of
https://github.com/hannobraun/Fornjot
synced 2025-05-15 07:18:27 +00:00
Support arcs in sketches
This commit is contained in:
parent
bcc95c411d
commit
5c50d9636e
@ -1,6 +1,6 @@
|
|||||||
use std::collections::{BTreeMap, BTreeSet};
|
use std::collections::{BTreeMap, BTreeSet};
|
||||||
|
|
||||||
use fj_math::{Point, Scalar};
|
use fj_math::{Circle, Point, Scalar};
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
@ -48,15 +48,41 @@ impl Sketch {
|
|||||||
.iter()
|
.iter()
|
||||||
.map(|([segment, next_segment], is_internal)| {
|
.map(|([segment, next_segment], is_internal)| {
|
||||||
let curve = match segment.segment {
|
let curve = match segment.segment {
|
||||||
SketchSegment::Arc { radius, .. } => {
|
SketchSegment::Arc { start, radius } => {
|
||||||
let _ = radius;
|
let end = next_segment.segment.start();
|
||||||
|
|
||||||
// We are creating a line here, temporarily, while
|
let start_to_end = end - start;
|
||||||
// support for arcs is being implemented.
|
let midpoint = start + start_to_end * 0.5;
|
||||||
Handle::new(Curve::line_from_vertices([
|
|
||||||
&segment.start,
|
let midpoint_towards_center =
|
||||||
&next_segment.start,
|
start_to_end.to_perpendicular().normalize()
|
||||||
]))
|
* radius.sign().to_scalar();
|
||||||
|
|
||||||
|
let distance_from_midpoint_to_center = {
|
||||||
|
let d = start_to_end.magnitude() / 2.;
|
||||||
|
(radius * radius - d * d).sqrt()
|
||||||
|
};
|
||||||
|
|
||||||
|
let center = midpoint
|
||||||
|
+ midpoint_towards_center
|
||||||
|
* distance_from_midpoint_to_center;
|
||||||
|
|
||||||
|
// This only works if `surface` is a plane, which
|
||||||
|
// checks out for now.
|
||||||
|
let circle = {
|
||||||
|
let a = start;
|
||||||
|
let b = center + (a - center).to_perpendicular();
|
||||||
|
|
||||||
|
let [center, a, b] = [center, a, b].map(|point| {
|
||||||
|
surface.geometry.point_from_local(point)
|
||||||
|
});
|
||||||
|
|
||||||
|
Circle::new(center, a - center, b - center)
|
||||||
|
};
|
||||||
|
|
||||||
|
Handle::new(Curve {
|
||||||
|
geometry: Box::new(circle),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
SketchSegment::Line { .. } => {
|
SketchSegment::Line { .. } => {
|
||||||
Handle::new(Curve::line_from_vertices([
|
Handle::new(Curve::line_from_vertices([
|
||||||
|
Loading…
Reference in New Issue
Block a user