import { angleOriente, centreCercleCirconscrit, droite, longueur, milieu, pointSurSegment, projectionOrtho, rotation } from '../2d.js'
/**
* Trace la médiatrice de [AB] au compas. Le paramétrage des longueurs correspond à la distance entre le milieu du segment et le point d'intersection des arcs de cercles
*
* @param {point} A
* @param {point} B
* @param {objet} options Défaut : {longueur1: 3, longueur2: 3, codage: 'X', couleurCodage : this.couleurCodage, couleurCompas: this.couleurCompas, coderFigure: true}
* @return {array} [arc1, arc2, arc3, arc4, codage1?, codage2?, codageCarre?]
*/
export const mediatriceAuCompas = function (A, B, options = {}) {
if (options.longueur1 === undefined) {
options.longueur1 = 3
}
if (options.longueur2 === undefined) {
options.longueur2 = -3
}
if (options.codage === undefined) {
options.codage = 'X'
}
if (options.couleurCodage === undefined) {
options.couleurCodage = this.couleurCodage
}
if (options.couleurCompas === undefined) {
options.couleurCompas = this.couleurCompas
}
if (options.coderFigure === undefined) {
options.coderFigure = true
}
const O = milieu(A, B)
const O2 = rotation(A, O, -90)
const M = pointSurSegment(O, O2, options.longueur1)
const N = pointSurSegment(O, O2, options.longueur2)
this.compasMontrer()
this.compasDeplacer(A, options)
let arc1, arc2, arc3, arc4
if (options.longueur1 === -1 * options.longueur2) { // Si la distance est la même des deux côtés, on peut faire les arcs de part et d'autre
this.compasEcarter(longueur(A, M), { vitesse: options.vitesse, sens: options.vitesse })
arc1 = this.compasTracerArcCentrePoint(A, M, { delta: options.delta, couleur: options.couleurCompas, sens: options.sens, vitesse: options.vitesse, tempo: options.tempo })
arc2 = this.compasTracerArcCentrePoint(A, N, { delta: options.delta, couleur: options.couleurCompas, sens: options.sens, vitesse: options.vitesse, tempo: options.tempo })
arc4 = this.compasTracerArcCentrePoint(B, N, { delta: options.delta, couleur: options.couleurCompas, sens: options.sens, vitesse: options.vitesse, tempo: options.tempo })
arc3 = this.compasTracerArcCentrePoint(B, M, { delta: options.delta, couleur: options.couleurCompas, sens: options.sens, vitesse: options.vitesse, tempo: options.tempo })
} else {
this.compasEcarter(longueur(A, M), options)
arc1 = this.compasTracerArcCentrePoint(A, M, { delta: options.delta, couleur: options.couleurCompas, sens: options.sens, vitesse: options.vitesse, tempo: options.tempo })
arc2 = this.compasTracerArcCentrePoint(B, M, { delta: options.delta, couleur: options.couleurCompas, sens: options.sens, vitesse: options.vitesse, tempo: options.tempo })
arc3 = this.compasTracerArcCentrePoint(B, N, { delta: options.delta, couleur: options.couleurCompas, sens: options.sens, vitesse: options.vitesse, tempo: options.tempo })
arc4 = this.compasTracerArcCentrePoint(A, N, { delta: options.delta, couleur: options.couleurCompas, sens: options.sens, vitesse: options.vitesse, tempo: options.tempo })
}
this.compasMasquer()
if (M.x <= N.x) {
this.regleDroite(M, N, options)
} else {
this.regleDroite(N, M, options)
}
this.regleMasquer()
if (options.coderFigure) {
const codage1 = this.segmentCodage(A, O, { codage: options.codage, couleur: options.couleurCodage, tempo: options.tempo })
const codage2 = this.segmentCodage(O, B, { codage: options.codage, couleur: options.couleurCodage, tempo: options.tempo })
const codageCarre = this.codageAngleDroit(A, O, O2, { couleur: options.couleurCodage, tempo: options.tempo, vitesse: options.vitesse })
return [arc1, arc2, arc3, arc4, codage1, codage2, codageCarre]
} else {
return [arc1, arc2, arc3, arc4]
}
}
/**
* Trace la médiatrice du segment [AB] avec la méthode Règle + équerre.
* @param {point} A
* @param {point} B
* @param {booléen} codage
*/
export const mediatriceRegleEquerre = function (A, B, codage = 'X') {
const O = milieu(A, B)
this.regleMontrer()
this.regleDeplacer(A)
this.regleRotation(B)
this.crayonMontrer()
const O2 = rotation(A, O, -90)
const O3 = rotation(A, O, 90)
const M = pointSurSegment(O, O2, 0.2)
const N = pointSurSegment(O, O3, 0.2)
if (this.y(M) > this.y(N)) {
this.trait(O, M)
} else {
this.trait(O, N)
}
this.regleMasquer()
if (this.x(A) < this.x(B)) {
this.equerreDeplacer(A)
this.equerreMontrer()
this.equerreRotation(B)
} else {
this.equerreDeplacer(B)
this.equerreMontrer()
this.equerreRotation(A)
}
this.equerreDeplacer(O)
this.crayonDeplacer(O)
this.trait(O, O2)
this.equerreMasquer()
this.regleDroite(O2, O3)
this.regleMasquer()
this.segmentCodage(A, O, codage)
this.segmentCodage(O, B, codage)
this.codageAngleDroit(A, O, O2)
}
/**
* Trace la hauteur issue de C dans un triangle ABC. Prolonge si besoin le segment [AB] pour avoir le pied de la hauteur et le codage de l'angle droit.
* @param {point} A 1er point de la base
* @param {point} B 2e point de la base
* @param {point} C Sommet dont est issue la hauteur
* @param {booléen} codage angle droit ajouté si true
*/
export const hauteur = function (A, B, C, codage = true) {
const d = droite(A, B)
d.isVisible = false
const H = projectionOrtho(C, d)
let G, D
if (this.x(A) < this.x(B)) {
G = A
D = B
} else {
G = B
D = A
}
if (this.x(H) < this.x(G)) { // si le pied de la hauteur est trop à gauche
this.regleProlongerSegment(D, G, longueur(G, H) + 2, this.couleur, this.tempo, this.vitesse, this.epaisseurTraitsDeConstruction, true)
}
if (this.x(H) > this.x(D)) { // si le pied de la hauteur est trop à droite
this.regleProlongerSegment(G, D, longueur(D, H) + 2, this.couleur, this.tempo, this.vitesse, this.epaisseurTraitsDeConstruction, true)
}
if (this.x(H) < this.x(G) || this.x(H) > this.x(D)) {
this.regleMasquer()
}
if (this.x(A) < this.x(B)) {
this.equerreDeplacer(A)
this.equerreMontrer()
this.equerreRotation(B)
} else {
this.equerreDeplacer(B)
this.equerreMontrer()
this.equerreRotation(A)
}
this.equerreDeplacer(H)
this.crayonMontrer()
this.crayonDeplacer(H)
this.trait(H, C)
this.equerreMasquer()
if (codage) {
this.codageAngleDroit(A, H, C)
}
this.crayonMasquer()
}
/**
* Trace la médiane issue de C passant par le milieu de [AB]
* @param {point} A
* @param {point} B
* @param {point} C
* @param {objet} options
*/
export const mediane = function (A, B, C, options = {}) {
if (options.codage === undefined) {
options.codage = 'X'
}
if (options.couleurTraitsDeConstruction === undefined) {
options.couleurTraitsDeConstruction = this.couleurTraitsDeConstruction
}
if (options.epaisseurTraitsDeConstruction === undefined) {
options.epaisseurTraitsDeConstruction = this.epaisseurTraitsDeConstruction
}
const O = milieu(A, B)
this.regleMontrer(A, options)
this.regleRotation(B, options)
this.crayonMontrer()
const O2 = rotation(A, O, -90)
const O3 = rotation(A, O, 90)
const M = pointSurSegment(O, O2, 0.2)
const N = pointSurSegment(O, O3, 0.2)
if (M.y > N.y) {
this.trait(O, M, { vitesse: options.vitesse, tempo: options.tempo, couleur: options.couleurTraitsDeConstruction, epaisseur: options.epaisseurTraitsDeConstruction })
} else {
this.trait(O, N, { vitesse: options.vitesse, tempo: options.tempo, couleur: options.couleurTraitsDeConstruction, epaisseur: options.epaisseurTraitsDeConstruction })
}
this.regleSegment(O, C, options)
if (options.codage) {
this.segmentCodage(A, O, options)
this.segmentCodage(O, B, options)
}
}
/**
* Trace la bissectrice de l'angle ABC au compas.
* @param {point} A
* @param {point} B
* @param {point} C
* @param {objet} param3
* @returns {objet} {arc1, arc2, arc3, arc4}
*/
export const bissectriceAuCompas = function (A, B, C, { codage = '/', l = 2, couleur = this.couleur, tempo = this.tempo, vitesse = this.vitesse, sens = Math.round(this.vitesse / 2), epaisseur = this.epaisseur, pointilles = this.pointilles, couleurCodage = this.couleurCodage, masquerTraitsDeConstructions = true } = {}) {
const A1 = pointSurSegment(B, A, l)
const C1 = pointSurSegment(B, C, l)
const angle = angleOriente(A, B, C)
const M = rotation(B, A1, -(180 - angle))
const options = { couleur: couleur, tempo: tempo, vitesse: vitesse, sens: sens, pointilles: false }
const arc1 = this.compasTracerArcCentrePoint(B, A1, options)
const arc2 = this.compasTracerArcCentrePoint(B, C1, options)
const arc3 = this.compasTracerArcCentrePoint(A1, M, options)
const arc4 = this.compasTracerArcCentrePoint(C1, M, options)
this.compasMasquer()
this.regleDemiDroiteOriginePoint(B, M, { longueur: longueur(B, A), couleur: couleur, tempo: tempo, vitesse: vitesse, sens: sens, epaisseur: epaisseur, pointilles: pointilles })
this.regleMasquer()
this.crayonMasquer()
if (codage) {
this.angleCodage(A, B, M, { couleur: couleurCodage, codage: codage, tempo: tempo })
this.angleCodage(M, B, C, { couleur: couleurCodage, codage: codage, tempo: tempo })
}
if (masquerTraitsDeConstructions) {
this.traitMasquer(arc1)
this.traitMasquer(arc2)
this.traitMasquer(arc3)
this.traitMasquer(arc4)
}
return { arc1: arc1, arc2: arc2, arc3: arc3, arc4: arc4 }
}
/**
* Construit les 3 médiatrices des côtés du triangle ABC puis le cercle circonscrit au triangle
* @param {point} A
* @param {point} B
* @param {point} C
* @param {objet} options
*/
export const cercleCirconscrit = function (A, B, C, options = {}) {
if (options.couleur === undefined) {
options.couleur = this.couleur
}
if (options.couleurMediatrice === undefined) {
options.couleurMediatrice = options.couleur
}
if (options.couleurCercle === undefined) {
options.couleurCercle = options.couleur
}
options.codage = 'X'
options.couleur = options.couleurMediatrice
const m1 = this.mediatriceAuCompas(A, B, options)
this.traitMasquer(m1[0]) // On cache les arcs de cercle une fois la médiatrice tracée
this.traitMasquer(m1[1])
this.traitMasquer(m1[2])
this.traitMasquer(m1[3])
options.codage = '||'
const m2 = this.mediatriceAuCompas(B, C, options)
this.traitMasquer(m2[0])
this.traitMasquer(m2[1])
this.traitMasquer(m2[2])
this.traitMasquer(m2[3])
options.codage = '///'
const m3 = this.mediatriceAuCompas(A, C, options)
this.traitMasquer(m3[0])
this.traitMasquer(m3[1])
this.traitMasquer(m3[2])
this.traitMasquer(m3[3])
const O = centreCercleCirconscrit(A, B, C)
options.couleur = options.couleurCercle
this.compasCercleCentrePoint(O, A, options)
}