123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- import { GeometricObject } from "../../../core/models/objects/geometric-object";
- import { IntersectionModel } from "../../intersection-component/models/intersection-model";
- import { ELEMENTS_CLASS } from "../../../core/enums/elements-class-enum";
- export class LineSegmentModel extends GeometricObject {
- constructor(pointA, pointB, label, id) {
- super(id);
- this.pointA = pointA;
- this.pointB = pointB;
- this.setLabel(label);
- super.setClass(ELEMENTS_CLASS.LINE_SEGMENT);
- }
- getStraight() {
- const aX = this.pointA.posX;
- const aY = this.pointA.posY;
- const bX = this.pointB.posX;
- const bY = this.pointB.posY;
- const a = bY - aY;
- const b = aX - bX;
- const c = a * aX + b * aY;
- return [a, b, c];
- }
- getDirection() {
- const aX = this.pointA.posX;
- const aY = this.pointA.posY;
- const bX = this.pointB.posX;
- const bY = this.pointB.posY;
- const a = bX - aX;
- const b = bY - aY;
- return [a, b];
- }
- getIntersection(geometricObject) {
- switch (geometricObject.elementClass) {
- case ELEMENTS_CLASS.LINE_SEGMENT:
- return this.getIntersectionByLine(geometricObject);
- case ELEMENTS_CLASS.CIRCUMFERENCE:
- return this.getIntersectionByCircumference(geometricObject);
- default:
- break;
- }
- }
- getIntersectionByLine(lineSegment) {
- const r = this.getStraight();
- const s = lineSegment.getStraight();
- const a1 = r[0];
- const b1 = r[1];
- const c1 = r[2];
- const a2 = s[0];
- const b2 = s[1];
- const c2 = s[2];
- const determinant = a1 * b2 - a2 * b1;
- if (determinant == 0) {
- return [
- new IntersectionModel(
- Number.MAX_SAFE_INTEGER,
- Number.MAX_SAFE_INTEGER,
- undefined,
- this,
- lineSegment
- )
- ];
- } else {
- const x = (b2 * c1 - b1 * c2) / determinant;
- const y = (a1 * c2 - a2 * c1) / determinant;
- return [new IntersectionModel(x, y, undefined, this, lineSegment)];
- }
- }
- getIntersectionByCircumference(circumference) {
- const r = this.getStraight();
- const s = circumference.getStraight();
- const a1 = r[0];
- const b1 = r[1];
- const c1 = r[2];
- const a2 = s[0];
- const b2 = s[1];
- const c2 = s[2];
- const determinant = a1 * b2 - a2 * b1;
- if (determinant == 0) {
- return [
- new IntersectionModel(
- Number.MAX_SAFE_INTEGER,
- Number.MAX_SAFE_INTEGER,
- undefined,
- this,
- circumference
- )
- ];
- } else {
- const x = (b2 * c1 - b1 * c2) / determinant;
- const y = (a1 * c2 - a2 * c1) / determinant;
- return [new IntersectionModel(x, y, undefined, this, circumference)];
- }
- }
- insideSegment(intersecX, intersecY) {
- const valuesR = this.getDirection();
- const dirX = valuesR[0];
- const dirY = valuesR[1];
- const cInterA = dirX * intersecX + dirY * intersecY;
- // comparaca cv do ponto A > cv da intersec => vazio
- const cRA = dirX * this.pointA.posX + dirY * this.pointA.posY;
- if (cInterA < cRA) {
- return false;
- }
- // comparaca cv do ponto B < cv da intersec => vazio
- const cRB = dirX * this.pointB.posX + dirY * this.pointB.posY;
- if (cInterA > cRB) {
- this.posX = Number.MAX_SAFE_INTEGER;
- this.posY = Number.MAX_SAFE_INTEGER;
- return false;
- }
- return true;
- }
- }
|