From f3b4b9edefdee76a1e35bca3fca28fe2b3950409 Mon Sep 17 00:00:00 2001 From: Laurent Knoll <laurent.knoll@orange.com> Date: Fri, 16 Sep 2022 18:18:57 +0200 Subject: [PATCH] =?UTF-8?q?Trac=C3=A9=20elliptique=20de=20la=20bo=C3=AEte?= =?UTF-8?q?=20de=20petri?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data/coords/ellipseCoords.ts | 9 +++++---- src/instruments/petriDish.ts | 29 +++++++++++++++-------------- src/lab.tsx | 5 +++-- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/data/coords/ellipseCoords.ts b/src/data/coords/ellipseCoords.ts index e285bd3..9202515 100644 --- a/src/data/coords/ellipseCoords.ts +++ b/src/data/coords/ellipseCoords.ts @@ -6,7 +6,7 @@ import * as paper from "paper"; export class EllipseCoords implements Coords { - public constructor(public center : paper.Point, public radiusX : number, public radiusY : number, public angle : number) { + public constructor(public center : paper.Point, public radiusX : number, public radiusY : number, public angle : number = 0) { } bounds(): paper.Rectangle { @@ -14,13 +14,14 @@ export class EllipseCoords implements Coords { } toPath(): paper.Path { - let fittingEllipse = new paper.Path.Ellipse(new paper.Rectangle( + let path = new paper.Path.Ellipse(new paper.Rectangle( new paper.Point(this.center.x - this.radiusX, this.center.y - this.radiusY), new paper.Size(2 * this.radiusX, 2 * this.radiusY) ) ); - fittingEllipse.rotate(-this.angle); - return fittingEllipse; + path.rotate(this.angle); + path.remove(); + return path; } /** diff --git a/src/instruments/petriDish.ts b/src/instruments/petriDish.ts index 7b2e2f3..197e49b 100644 --- a/src/instruments/petriDish.ts +++ b/src/instruments/petriDish.ts @@ -2,13 +2,14 @@ import * as paper from "paper"; import {AbstractInstrument, Handle, Instrument} from "./instrument"; import {CircleCoords} from "../data/coords/circleCoords"; import {Lab} from "../lab"; +import {EllipseCoords} from "../data/coords/ellipseCoords"; /** * Représente la boîte de Petri */ -export class PetriDish extends AbstractInstrument<CircleCoords> implements Instrument { +export class PetriDish extends AbstractInstrument<EllipseCoords> implements Instrument { - public constructor(protected lab : Lab, coords : CircleCoords) { + public constructor(protected lab : Lab, coords : EllipseCoords) { super(lab, coords, [ new Handle("rightHandle", true), new Handle("bottomHandle", true), @@ -16,11 +17,11 @@ export class PetriDish extends AbstractInstrument<CircleCoords> implements Instr ]) } - drawIn(coords : CircleCoords, group: paper.Group) { - group.addChild(new paper.Path.Circle(coords.center, coords.radius)); + drawIn(coords : EllipseCoords, group: paper.Group) { + group.addChild(coords.toPath()); } - onHandleMove(coords: CircleCoords, handle: Handle, point: paper.Point, delta: paper.Point): void { + onHandleMove(coords: EllipseCoords, handle: Handle, point: paper.Point, delta: paper.Point): void { switch (handle.name) { case "centerHandle" : coords.center = coords.center.add(delta); @@ -28,34 +29,34 @@ export class PetriDish extends AbstractInstrument<CircleCoords> implements Instr case "rightHandle": let newRadiusX = point.x - coords.center.x; - let deltaRadiusX = newRadiusX - coords.radius; + let deltaRadiusX = newRadiusX - coords.radiusX; if(newRadiusX > 10) { - coords.radius = coords.radius + deltaRadiusX / 2; - coords.center = coords.center.add(new paper.Point(deltaRadiusX, 0)); + coords.radiusX = coords.radiusX + deltaRadiusX / 2; + coords.center = coords.center.add(new paper.Point(deltaRadiusX / 2, 0)); } break; case "bottomHandle": let newRadiusY = point.y - coords.center.y; - let deltaRadiusY = newRadiusY - coords.radius; + let deltaRadiusY = newRadiusY - coords.radiusY; if(newRadiusY > 10) { - coords.radius = coords.radius + deltaRadiusY / 2; - coords.center = coords.center.add(new paper.Point(0, deltaRadiusY)); + coords.radiusY = coords.radiusY + deltaRadiusY / 2; + coords.center = coords.center.add(new paper.Point(0, deltaRadiusY / 2)); } break; } } - locateHandle(coords: CircleCoords, handle: Handle): paper.Point { + locateHandle(coords: EllipseCoords, handle: Handle): paper.Point { switch (handle.name) { case "centerHandle" : return coords.center; case "rightHandle": - return coords.center.add(new paper.Point(coords.radius, 0)); + return coords.center.add(new paper.Point(coords.radiusX, 0)); case "bottomHandle": - return coords.center.add(new paper.Point(0, coords.radius)); + return coords.center.add(new paper.Point(0, coords.radiusY)); default: throw new Error("Unknown handle"); diff --git a/src/lab.tsx b/src/lab.tsx index d9190bc..59ad974 100644 --- a/src/lab.tsx +++ b/src/lab.tsx @@ -14,6 +14,7 @@ import {CircleCoords} from "./data/coords/circleCoords"; import {PathCoords} from "./data/coords/pathCoords"; import {DownloadStep} from "./steps/downloadStep"; import {PaperUtils} from "./utils/paperUtils"; +import {EllipseCoords} from "./data/coords/ellipseCoords"; export interface LabData { @@ -25,7 +26,7 @@ export interface LabData { rulerCoords : VectorCoords, - petriDishCoords : CircleCoords, + petriDishCoords : EllipseCoords, blobMaskCoords : PathCoords } @@ -148,7 +149,7 @@ export class Lab extends React.Component<{}> { rulerCoords: new VectorCoords(new paper.Point(width * 0.25, height / 2), new paper.Point(width * 0.75, height / 2)), - petriDishCoords: new CircleCoords(new paper.Point(width / 2, height / 2), width * 0.75 / 2), + petriDishCoords: new EllipseCoords(new paper.Point(width / 2, height / 2), width * 0.75 / 2, width * 0.75 / 2, 0), blobMaskCoords: new PathCoords(new paper.Path()), -- GitLab