fix(ellipse): add symmetric axis grips
This commit is contained in:
parent
97a6322e2a
commit
3f9c3a9e9a
1 changed files with 26 additions and 15 deletions
|
|
@ -66,11 +66,7 @@ fn to_render(ell: &Ellipse) -> RenderEntity {
|
||||||
|
|
||||||
fn grips(ell: &Ellipse) -> Vec<GripDef> {
|
fn grips(ell: &Ellipse) -> Vec<GripDef> {
|
||||||
let ctr = glam::DVec3::new(ell.center.x, ell.center.y, ell.center.z);
|
let ctr = glam::DVec3::new(ell.center.x, ell.center.y, ell.center.z);
|
||||||
let maj = glam::DVec3::new(
|
let major = glam::DVec3::new(ell.major_axis.x, ell.major_axis.y, ell.major_axis.z);
|
||||||
ell.center.x + ell.major_axis.x,
|
|
||||||
ell.center.y + ell.major_axis.y,
|
|
||||||
ell.center.z + ell.major_axis.z,
|
|
||||||
);
|
|
||||||
let major_xy =
|
let major_xy =
|
||||||
((ell.major_axis.x * ell.major_axis.x + ell.major_axis.y * ell.major_axis.y) as f64).sqrt();
|
((ell.major_axis.x * ell.major_axis.x + ell.major_axis.y * ell.major_axis.y) as f64).sqrt();
|
||||||
let (px, py) = if major_xy > 1e-10 {
|
let (px, py) = if major_xy > 1e-10 {
|
||||||
|
|
@ -79,12 +75,17 @@ fn grips(ell: &Ellipse) -> Vec<GripDef> {
|
||||||
} else {
|
} else {
|
||||||
(0.0, ell.major_axis_length() * ell.minor_axis_ratio)
|
(0.0, ell.major_axis_length() * ell.minor_axis_ratio)
|
||||||
};
|
};
|
||||||
let min = glam::DVec3::new(ell.center.x + px, ell.center.y + py, ell.center.z);
|
let minor = glam::DVec3::new(px, py, 0.0);
|
||||||
vec![
|
let mut grips = vec![
|
||||||
center_grip(0, ctr),
|
center_grip(0, ctr),
|
||||||
square_grip(1, maj),
|
square_grip(1, ctr + major),
|
||||||
square_grip(2, min),
|
square_grip(2, ctr + minor),
|
||||||
]
|
];
|
||||||
|
if ell.is_full() {
|
||||||
|
grips.push(square_grip(3, ctr - major));
|
||||||
|
grips.push(square_grip(4, ctr - minor));
|
||||||
|
}
|
||||||
|
grips
|
||||||
}
|
}
|
||||||
|
|
||||||
fn properties(ell: &Ellipse) -> Vec<PropSection> {
|
fn properties(ell: &Ellipse) -> Vec<PropSection> {
|
||||||
|
|
@ -200,12 +201,22 @@ fn apply_grip(ell: &mut Ellipse, grip_id: usize, apply: GripApply) {
|
||||||
ell.center.y = p.y as f64;
|
ell.center.y = p.y as f64;
|
||||||
ell.center.z = p.z as f64;
|
ell.center.z = p.z as f64;
|
||||||
}
|
}
|
||||||
(1, GripApply::Absolute(p)) => {
|
(1 | 3, GripApply::Absolute(p)) => {
|
||||||
ell.major_axis.x = p.x as f64 - ell.center.x;
|
let direction = if grip_id == 1 { 1.0 } else { -1.0 };
|
||||||
ell.major_axis.y = p.y as f64 - ell.center.y;
|
ell.major_axis.x = (p.x as f64 - ell.center.x) * direction;
|
||||||
ell.major_axis.z = p.z as f64 - ell.center.z;
|
ell.major_axis.y = (p.y as f64 - ell.center.y) * direction;
|
||||||
|
ell.major_axis.z = (p.z as f64 - ell.center.z) * direction;
|
||||||
}
|
}
|
||||||
(2, GripApply::Absolute(p)) => {
|
(2 | 4, GripApply::Absolute(p)) => {
|
||||||
|
let p = if grip_id == 4 {
|
||||||
|
glam::DVec3::new(
|
||||||
|
2.0 * ell.center.x - p.x,
|
||||||
|
2.0 * ell.center.y - p.y,
|
||||||
|
2.0 * ell.center.z - p.z,
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
p
|
||||||
|
};
|
||||||
// Minor-axis grip. The two axes are always perpendicular, so this
|
// Minor-axis grip. The two axes are always perpendicular, so this
|
||||||
// grip stretches one of them along its fixed direction while the
|
// grip stretches one of them along its fixed direction while the
|
||||||
// other stays put. Work in the ellipse's view plane (XY).
|
// other stays put. Work in the ellipse's view plane (XY).
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue