Compare commits

...

588 Commits

Author SHA1 Message Date
Daniele Bariletti 466f92384b EgtGeomKernel :
- aggiunta dipendenza header
- aggiornata cartella header.
2025-09-29 09:17:20 +02:00
Daniele Bariletti 326f85c3d2 Merge branch 'master' into abseil 2025-09-26 12:56:07 +02:00
Daniele Bariletti 00b6f8583a EgtGeomKernel :
- piccola correzione.
2025-09-26 12:48:48 +02:00
Daniele Bariletti 4cf4a99107 EgtGeomKernel :
- puliza codice.
2025-09-26 12:10:18 +02:00
Daniele Bariletti 137289e843 EgtGeomKernel :
- correzione del merge.
2025-09-26 11:00:20 +02:00
Daniele Bariletti e7b066e75e Merge branch 'FasterVMill5Axis_Bez3x1' 2025-09-26 10:49:41 +02:00
Daniele Bariletti cd0828f3e0 Merge branch 'master' into FasterVMill5Axis_Bez3x1 2025-09-26 10:49:25 +02:00
Daniele Bariletti 563697f840 EgtGeomKernel :
- correzione al box del volume spazzato VM 5assi
- modificata gestione conversione curve a bezier.
2025-09-26 10:47:06 +02:00
Dario Sassi 61fc814528 EgtGeomKernel :
- piccola modifica per migliorare ricerca di inizio con stringa (starts_with).
2025-09-24 17:19:37 +02:00
Dario Sassi 7c90dbabea EgtGeomKernel 2.7i6 :
- ricompilazione con cambio versione (e abilitato multithread in MillingGeneralMotionStep).
2025-09-24 10:38:35 +02:00
Daniele Bariletti 5ee0f3c373 Merge branch 'master' into FasterVMill5Axis_Bez3x1 2025-09-24 10:30:21 +02:00
Daniele Bariletti 098bdd0076 EgtGeomKernel :
- semplificazione VM5assi.
2025-09-24 10:29:57 +02:00
Daniele Bariletti 40b6da6b44 EgtGeomKernel :
- correzione selezione caso VM5assi.
2025-09-24 09:46:02 +02:00
Daniele Bariletti b083dabc6b EgtGeomKernel :
- correzione piccolo errore
2025-09-24 09:35:52 +02:00
Daniele Bariletti 7fcc3ed42d Merge branch 'master' into FasterVMill5Axis_Bez3x1 2025-09-24 09:10:54 +02:00
Daniele Bariletti ccefe1314f EgtGeomKernel :
- aggiunta libreria abseil.
2025-09-23 09:47:38 +02:00
Dario Sassi 4ed362f226 EgtGeomKernel 2.7i5 :
- ritorno alla vecchia modalità per virtual milling a 5 assi
- piccoli aggiustamenti soprattutto estetici.
2025-09-22 18:59:27 +02:00
Dario Sassi 39d98f79fb EgtGeomKernel :
- migliorie e correzioni per creazione Zmap da trimesh e riconoscimento box.
2025-09-19 11:13:22 +02:00
Dario Sassi c79f7ba245 EgtGeomKernel 2.7i4 :
- eliminato memory leak in ArcToBezierCurve
- altre piccole modifiche stilistiche.
2025-09-18 19:11:59 +02:00
Dario Sassi 16354ff435 EgtGeomKernel :
- piccola correzione (seno non coseno).
2025-09-18 08:43:22 +02:00
Daniele Bariletti f3a191dd62 EgtGeomKernel :
- modificato valore di soglia per angolo di intersezione tra spillone e trimesh nella costruzione di una Zmap.
2025-09-17 15:38:44 +02:00
Daniele Bariletti cb0a5092fb Merge branch 'master' of https://gitlab.steamware.net/egalware-cadcam/libreriebase/EgtGeomKernel 2025-09-16 14:35:53 +02:00
Daniele Bariletti 8730f55308 EgtGeomKernel :
- correzione valore di default   di ingrandimento box per la costruzione VolZmap da trimesh.
2025-09-16 14:35:47 +02:00
Daniele Bariletti 932e98d19c EgtGeomKernel :
- correzione alla creazione di un VolZmap da trimesh.
2025-09-16 14:32:36 +02:00
Riccardo Elitropi 3a69dcfa79 EgtGeomKernel (2.7i3) :
- Aggiunta funzione in DistPointSurfTm per ottenere i triangoli a minima distanza
- Aggiunte funzioni per Offset Fillet di VolZmap e per Offset generici di superfici TriMesh aperte.
2025-09-12 17:01:14 +02:00
Daniele Bariletti 5930674d4a EgtGeomKernel :
- correzione alla chiamata della ArcToBezierCurve.
2025-09-12 16:12:43 +02:00
Daniele Bariletti df6b20d97f EgtGeomKernel :
- correzioni alle chiamate della ArcToBezierCurve.
2025-09-12 16:02:55 +02:00
Daniele Bariletti 4200af5296 Merge branch 'FasterVMill5Axis_Bez3x1' 2025-09-12 15:42:44 +02:00
Daniele Bariletti b0c9c5be2e EgtGeomKernel :
- aggiornate le funzioni per la conversione di curve in/da bezier.
2025-09-12 15:40:39 +02:00
Daniele Bariletti f2bb1deac4 Merge branch 'master' into FasterVMill5Axis_Bez3x1 2025-09-12 15:12:05 +02:00
Daniele Bariletti 94ec83aa60 EgtGeomKernel :
- pulizia avvisi compilatore.
2025-09-12 15:11:30 +02:00
Daniele Bariletti e183eec3ea EgtGeomKernel :
- puliza codice.
2025-09-12 15:07:18 +02:00
Daniele Bariletti b179771ec9 EgtGeomKernel :
- pulizia codice.
2025-09-12 15:02:15 +02:00
Daniele Bariletti d7380a09c1 EgtGeomKernel :
- correzioni e ottimizzazioni al VM 5 assi 3x1.
2025-09-12 09:02:39 +02:00
Dario Sassi afc316cd1d EgtGeomKernel 2.7i2 :
- aggiunta funzione globale SetDefaultFont.
2025-09-11 15:21:51 +02:00
Riccardo Elitropi b6f820258a EgtGeomKernel :
- piccola correzione In Invert per SurfTriMesh.
2025-09-11 09:30:08 +02:00
Daniele Bariletti 116b605cb1 EgtGeomKernel :
- correzioni e migliorie al VM 5 assi 3x1.
2025-09-10 17:59:43 +02:00
Daniele Bariletti 9f5ce42393 EgtGeomKernel :
- aggiornamento dell'enum per le intersezioni linea bezier.
2025-09-10 09:48:36 +02:00
Daniele Bariletti 9716d93c15 Merge branch 'master' into FasterVMill5Axis_Bez3x1. 2025-09-09 14:58:35 +02:00
Daniele Bariletti 3465179379 EgtGeomKernel :
- debug.
2025-09-09 14:47:37 +02:00
Dario Sassi c7aad8d917 EgtGeomKernel :
- piccole migliorie e correzioni.
2025-09-09 09:12:53 +02:00
SaraP 8ddc1c70e1 EgtGeomKernel :
- ripristinata AssociatePolyLinesMinDistPoints ( la modifica è stata spostata nell'executor solo per associazione nel caso di spiralize della curva).
2025-09-08 17:32:46 +02:00
Daniele Bariletti 5230261be8 EgtGeomKernel :
- aggiunta funzione per l'accoppiamento di punti di due polyline.
2025-09-08 17:21:16 +02:00
Daniele Bariletti 8cc8d6eb03 EgtGeomKernel :
- aggiunta funzione per l'accoppiamento di punti di due polyline.
2025-09-08 17:19:23 +02:00
Riccardo Elitropi 7a95e4c5a3 Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2025-09-08 16:51:20 +02:00
Riccardo Elitropi 1c0f182bbc EgtGeomKernel :
- correzione controllo indici per AddIntervals su VolZmap.
2025-09-08 16:51:11 +02:00
SaraP 736e20e599 EgtGeomKernel :
- nell'associare i punti a minima distanza delle polylines aggiuta gestione speciale per gli spigoli.
2025-09-08 15:21:27 +02:00
Daniele Bariletti c71c8e8c12 EgtGeomKernel :
- miglioria per il VM 5 assi: riduco i tagli inutili.
2025-09-08 12:25:54 +02:00
Dario Sassi 9c7a29f939 EgtGeomKernel :
- piccola miglioria.
2025-09-08 11:02:08 +02:00
Riccardo Elitropi 40bb15e46b EgtGeomKernel :
- Aggiunta gestione Offset Thickening per superfici TriMesh
- Aggiunta gestione Offset Chamfer ed Extend per superfici TriMesh.
2025-09-05 17:01:59 +02:00
Daniele Bariletti fb957b61d2 Merge branch 'master' of https://gitlab.steamware.net/egalware-cadcam/libreriebase/EgtGeomKernel 2025-09-05 10:03:31 +02:00
Daniele Bariletti 4da9dcb062 EgtGeomKernel :
- aggiunto limite per la divisione del parametrico di una bezier.
2025-09-05 10:03:25 +02:00
Dario Sassi 60f9302c3f EgtGeomKernel 2.7i1 :
- ricompilazione con cambio versione.
2025-09-04 19:35:29 +02:00
Daniele Bariletti 2553f15e7b EgtGeomKernel :
- uniformazione delle funzioni per l'approssimazione curve con bezier.

(cherry picked from commit 05c0b0a18b)
(cherry picked from commit 6f1f3441ea)
2025-09-04 15:08:52 +02:00
Daniele Bariletti e8d31f2020 EgtGeomKernel :
- piccola correzione.
2025-09-04 12:55:54 +02:00
Daniele Bariletti 4c693ccd60 EgtGeomkernel :
- aggiunta intersezione linea - superficie bezier bilineare.
2025-09-04 12:43:50 +02:00
Daniele Bariletti c550fb1848 EgtGeomKernel :
- piccoli aggiustamenti.
2025-09-04 12:43:16 +02:00
Daniele Bariletti e49bd5a2a0 EgtGeonKernel :
- correzioni a VM5 assi con bezier 3x1.
2025-09-02 12:51:39 +02:00
Daniele Bariletti 81be6ce7b9 EgtGeomKernel :
- correzioni al VM 5 assi con bezier 3x1.
2025-09-01 14:54:30 +02:00
Dario Sassi 2d6bf3d9dc EgtGeomKernel :
- piccole migliorie a curve e superfici di Bezier.
2025-08-30 10:51:48 +02:00
Dario Sassi b2244b7f43 EgtGeomKernel :
- ricuperate correzioni di Daniele sugli include.
2025-08-29 20:14:27 +02:00
Dario Sassi 53dcd9c863 Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2025-08-29 19:53:34 +02:00
Dario Sassi 75f70d2b30 EgtGeomKernel 2.7h2 :
- piccola miglioria in proiezione curve su superfici di Bezier.
2025-08-29 19:52:13 +02:00
Daniele Bariletti 36b1df1a27 EgtGeomKernel :
- correzione al merge.
2025-08-29 08:50:00 +02:00
Daniele Bariletti 5a445c5c0b Merge remote-tracking branch 'origin/master' into FasterVMill5Axis_Bez3x1 2025-08-28 16:12:59 +02:00
Riccardo Elitropi df828ab2ba EgtGeomKernel :
- in CalcPocketing piccola miglioria per Conformal.
2025-08-28 14:41:44 +02:00
Daniele Bariletti db855ca99b EgtGeomKernel :
- correzione per il caso no_base_inters in VM5 assi 3x1.
2025-08-28 13:04:10 +02:00
Daniele Bariletti d79cb50aca EgtGeomKernel :
- tolto l'uso di namespace std dagli header.

(cherry picked from commit 704a977475)
2025-08-28 10:12:17 +02:00
Dario Sassi 371ff54d9c EgtGeomKernel :
- aggiunte funzioni GetSurfBezierAuxSurfTol e GetSurfBezierAuxSurfRefinedTol.
2025-08-24 19:13:18 +02:00
Daniele Bariletti df7b4ff81f EgtGeomKernel :
- correzioni e miglioramenti per il VM5assi con superfici bezier di grado 3x1.
2025-08-22 12:34:52 +02:00
Dario Sassi f22ea484db EgtGeomKernel :
- modifiche e migliorie calcoli per approssimazione di superfici di Bezier con trimesh
- aggiunte funzioni globali per impostare tolleranze di approssimazione delle superfici di Bezier
- eliminazione dell'uso della funzione pow (inefficiente) dove non necessaria
- utilizzo di Pow (efficiente) per potenze con esponente intero.
2025-08-22 11:44:56 +02:00
Daniele Bariletti 574041cf18 EgtGeomKernel :
- aggiunta funzione per restituire tutti i punti di controllo di una surf di bezier.
2025-08-22 09:41:13 +02:00
Daniele Bariletti ff2cc4f999 EgtGeomKernel :
- prima versione del VM5 assi con superfici di bezier 3x1.
2025-08-07 11:22:43 +02:00
Daniele Bariletti 05c0b0a18b EgtGeomKernel :
- uniformazione delle funzioni per l'approssimazione curve con bezier.
2025-08-07 11:22:20 +02:00
Riccardo Elitropi 1b9738eace EgtGeomKernel :
- In CalcPocketing piccola correzione per lavorazione Conformal
- In IntersParLinesSurfTm aggiunta estensione per intersezione con vettore di superfici TriMesh e aggiunto indice di superficie in IntLinStmInfo.
2025-08-04 14:40:43 +02:00
Daniele Bariletti 8ee5bc74d5 EgtGeomKernel :
- aggiunta e miglioramento funzioni per la gesitone di curve bezier.
2025-08-04 09:56:48 +02:00
Dario Sassi 0a8cc414a5 EgtGeomKernel 2.7h1 :
- ricompilazione con cambio versione.
2025-08-03 13:39:03 +02:00
Riccardo Elitropi 7a682653cd EgtGeomKernel :
- in CAvParSilhouettesSurfTm corretta estensione XY della griglia per utensili a cui è applicato un Offset Radiale.
2025-08-01 16:34:46 +02:00
Daniele Bariletti 9286ab6535 EgtGeomKernel :
- correzioni e miglioramenti al VM 5assi.
2025-08-01 10:29:01 +02:00
Riccardo Elitropi 85736ab03f Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2025-07-30 13:22:57 +02:00
Riccardo Elitropi 673f5c7a9b EgtGeomKernel :
- In CalcPocketing corretto punto di ingresso per caso ottimizzato a Spirale con curve di Bordo Open.
2025-07-30 13:21:38 +02:00
Dario Sassi 34d0bcbdfe EgtGeomKernel :
- in FromPolyLine di CurveComposite conservo i parametri degli estremi.
2025-07-28 08:34:44 +02:00
Riccardo Elitropi 7abf3027d4 EgtGeomKernel :
- in CalcPocketing corretta gestione superficie limite per Conformal.
2025-07-24 11:21:22 +02:00
Daniele Bariletti ffe3d44cac EgtGeomKernel :
- correzioni al VM 5 assi con bilineari.
2025-07-23 14:56:20 +02:00
Daniele Bariletti dd23b848ac Merge branch 'master' into FasterVMill5Axis 2025-07-22 14:40:30 +02:00
Daniele Bariletti 33cca03698 EgtGeomKernel :
- piccole migliorie tecniche.
2025-07-22 13:13:49 +02:00
Daniele Bariletti d4d14dd866 EgtGeomKernel :
- correzioni alla funzione IsClosed per le surf Bezier.
2025-07-22 11:33:51 +02:00
Daniele Bariletti d6f0fdac50 EgtGeomKernel :
- correzioni VM 5 assi.
2025-07-22 09:12:34 +02:00
Dario Sassi 080605510c EgtGeomKernel :
- prime modifiche e correzioni a creazione di superfici di Bezier.
2025-07-22 08:30:27 +02:00
Daniele Bariletti 1a7b789ef3 EgtGeomKernel :
- aggiornata funzione IsClosed per le superfici di Bezier.
2025-07-21 12:33:42 +02:00
Daniele Bariletti cc4183a677 Merge branch 'master' into FasterVMill5Axis 2025-07-21 09:03:18 +02:00
Daniele Bariletti c2bae56656 EgtGeomKernel :
- versione completa VM 5 assi con bilineari e volumi chiusi.
2025-07-21 08:27:47 +02:00
Dario Sassi 38a5c0cbb3 EgtGeomKernel :
- correzione nell'aggiunta di curve a CurveComposite (gestito caso di altra curva che va trasformata in segmento di retta).
2025-07-15 19:25:36 +02:00
SaraP 81a8eb698e EgtGeomKernel :
- correzione del test per archi degeneri nell'offset con Voronoi.
2025-07-15 15:07:50 +02:00
SaraP ee4bb7d7c4 EgtGeomKernel :
- correzione nell'offset con Voronoi per archi piccoli.
2025-07-15 11:52:23 +02:00
Riccardo Elitropi 8b0d5bddbf EgtGeomKernel :
- In CalcPocketing piccola miglioria per il calcolo delle regioni non svuotate.
2025-07-14 17:46:36 +02:00
Daniele Bariletti ba75033f0a EgtGeomKernel :
- VM 5 assi con volumi chiusi, con bilineari.
2025-07-14 17:30:03 +02:00
Riccardo Elitropi eb2b90c6f2 EgtGeomKernel :
- In CalcPocketing aggiunto flag per calcolo delle regioni non svuotate.
2025-07-14 10:14:04 +02:00
Riccardo Elitropi 3b5c34cb05 EgtGeomKernel :
- in CalcPocketing migliorati i collegamenti per lavorazioni Conformal e migliorato l'orientamento delle curve per lavorazioni Spiral.
2025-07-11 15:38:55 +02:00
Dario Sassi 2fe22a62c2 EgtGeomKernel :
- in svuotature SpiralOut non si eliminano le passate iniziali adiacenti.
2025-07-09 15:36:36 +02:00
Dario Sassi ff6307fcca EgtGeomKernel :
- prime sistemazioni per offset superfici trimesh tramite Zmap.
2025-07-07 14:59:06 +02:00
Daniele Bariletti c6e80a0b6a EgtGeomKernel :
- accorpamento del codice VM 5 assi.
2025-07-04 17:14:04 +02:00
Riccardo Elitropi b957cc75be EgtGeomKernel :
- aggiunte funzioni per calcolo di Zmap e TriMesh di Offset Fillet Thickening.
2025-07-04 12:59:43 +02:00
Daniele Bariletti fc18539472 EgtGeomKernel :
- correzioni a VM 5assi.
2025-07-04 12:37:06 +02:00
Daniele Bariletti de7229aee7 EgtGeomKernel :
- correzioni a VM 5 assi con casi ottimizzati.
2025-07-02 17:14:08 +02:00
Riccardo Elitropi 53e66032a0 EgtGeomKernel 2.7g1 :
- migliorata e corretta la classe di calcolo delle Silhouette (l'Offset viene eseguito su tutte le curve e non singolarmente e l'estensione XY del Box locale tiene conto del raggio utensile per utensili non standard)
- in SurfTriMesh aggiunte le funzioni per il calcolo dei Box delle Parts
- in Offset delle superfici, ripristinata la funzione di somma di intervalli senza media delle normali e rimozione di memoryLeaks.
2025-07-02 11:44:10 +02:00
Daniele Bariletti 2fc6c30c8f EgtGeomKernel :
- imbastimento versione VM 5 assi con gestione casi diversi.
2025-06-27 15:53:24 +02:00
Riccardo Elitropi f05c5f1261 EgtGeomKernel :
- aggiunte funzioni per Offset e FatOffset per un insieme di curve
- in VolZmapOffset migliorata la gestione delle normali per l'addizione di intervalli.
2025-06-25 15:51:19 +02:00
Daniele Bariletti 6af5591cf6 EgtGeomKernel :
- estensione del VM 5 assi e 3 assi ai casi con utensili diversi dal cilindro.
2025-06-20 16:20:12 +02:00
Daniele Bariletti 41cbe862e5 EgtGeomKernel :
- versione corretta del VM a 5 assi per lama e 3 assi.
2025-06-19 16:26:31 +02:00
Riccardo Elitropi 057b8273e2 EgtGeomKernel :
- in VolZmap::CreateFromTriMesh() corretta espansione per caso Box in attesa di correzione in marching Cubes.
2025-06-19 12:47:35 +02:00
SaraP 6421c12408 EgtGeomKernel :
- piccola modifica.
2025-06-17 08:24:47 +02:00
Daniele Bariletti 0aca5aeb07 Merge branch 'master' into FasterVMill5Axis 2025-06-16 15:12:20 +02:00
Daniele Bariletti bdbd3583b8 EgtGeomKernel :
- versione temporanea per VM5assi per caso lama e 3 assi.
2025-06-16 15:10:10 +02:00
Riccardo Elitropi 626d5b0e51 EgtGeomKernel 2.7f2 :
- Aggiunte funzioni per calcolo di Offset per superfici chiuse TriMesh
- Piccola miglioria alla triangolazione (con SaraP)
- Migliorie per rimozioni TJunction, calcolo delle normali dei triangoli e creazione di una TriMesh a partire da uno ZMap (con SaraP)
- Aggiunte funzioni di SubtractMap e piccole modifiche per estensione dei Box di creazione per gli Zmap.
2025-06-16 11:34:23 +02:00
SaraP 0bffa0039c EgtGeomKernel 2.7f1 :
- migliorie e piccole correzioni varie nelle trimesh ( booleane, chiusura).
2025-06-09 15:47:11 +02:00
Riccardo Elitropi 9819c8cee8 EgtGeomKernel :
- In CalcPocketing piccola modifica sui nomi dei parametri della funzione.
2025-06-09 12:13:56 +02:00
Riccardo Elitropi 53ab676750 EgtGeomKernel :
- In CalcPocketing correzione piccolo errore.
2025-06-09 11:38:46 +02:00
Riccardo Elitropi afa4872c97 EgtGeomKernel :
- In CalcPocketing piccola modifica per smussi sui raccordi speciali.
2025-06-06 16:51:25 +02:00
Riccardo Elitropi bf56d53faf EgtGeomKernel :
- In CalcPocketing sistemate le tolleranze di merge per le curve e migliorati i controlli per raccordi a circonferenza.
- In CurveComposite aggiunto controllo su Archi con angolo al centro circa a giro seguiti/precedeuti da curve di lunghezza sotto alla tolleranza lineare.
2025-06-04 16:26:33 +02:00
Daniele Bariletti f03adb9206 EgtGeomKernel :
- nuova versione VM 5 assi per caso lama e 3 assi.
2025-06-03 15:48:37 +02:00
Daniele Bariletti 529fa2e4a0 EgtGeomKernel :
- correzioni a VMill 5 assi e tentaivo di miglioramento per caso lama e 3 assi.
2025-06-03 09:30:48 +02:00
Dario Sassi 6df1b90e95 EgtGeomKernel 2.7e3 :
- in CurveComposite AddPoint comprende le funzionalità di FromPoint che è stata eliminata
- modifiche conseguenti in altre parti.
2025-05-31 11:54:21 +02:00
Riccardo Elitropi 9cba0e6d15 EgtGeomKernel :
- piccoli miglioramenti in CalcPocketing.
2025-05-30 17:04:19 +02:00
Riccardo Elitropi f16de3a20c EgtGeomKernel :
- in CalcPocketing, corretta gestione aree non svuotate nel caso di assenza di smussi o di cambio tipo di lavorazione.
2025-05-30 13:28:10 +02:00
Riccardo Elitropi 8cfa41d09f EgtGeomKernel :
- piccola correzione in CalcPocketing.
2025-05-30 12:18:23 +02:00
Riccardo Elitropi b59b501366 EgtGeomKernel :
- piccola correnzione in CalcPocketing.
2025-05-30 12:15:19 +02:00
Riccardo Elitropi 504bb50b13 EgtGeomKernel :
- modifica prototipi
- piccola miglioria per casi ottimizzati a Spirale in CalcPocketing.
2025-05-30 11:46:37 +02:00
Dario Sassi 969f1266e7 EgtGeomKernel :
- correzione euristica su Vmill a 5assi, in attesa di soluzione definitiva in sviluppo
2025-05-30 10:59:40 +02:00
Riccardo Elitropi fa680b7799 EgtGeomKernel :
- Aggiunto controllo sulla scalatura nella funzione GetSilhouette in SurfTriMesh
- In CalcPocketing, aggiunte funzioni ausiliarie per Debug.
2025-05-29 11:52:19 +02:00
Dario Sassi e185c85d5e EgtGeomKernel :
- piccola correzione provvisoria su Vmill a 5assi, in attesa di soluzione definitiva in sviluppo.
2025-05-29 08:30:50 +02:00
Daniele Bariletti acb0a5bd5e EgtGeomKernel :
- correzione e miglioramento del VM 5 assi per il caso lama e lavorazione 3 assi.
2025-05-28 17:57:03 +02:00
Riccardo Elitropi 62ce576d4d Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2025-05-28 17:22:55 +02:00
Riccardo Elitropi 161d3d9b17 EgtGeomKernel :
- In CalcPocketing aggiunte correzioni e migliorie per raccordi tra offset, per calcolo e rimozione delle regioni non svuotate e scelta degli offset per i percorsi.
2025-05-28 17:22:49 +02:00
Dario Sassi d88baa070f EgtGeomKernel 2.7e2 :
- ricompilazione con cambio versione.
2025-05-27 16:00:17 +02:00
Riccardo Elitropi 2b087dde51 Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2025-05-27 14:27:25 +02:00
Riccardo Elitropi 7894a8fdc8 EgtGeomKernel :
- In CalcPocketing aggiunto riconoscimento per curve SpiralCirle.
2025-05-27 14:27:20 +02:00
SaraP 0f14e8335a EgtGeomKernel :
- aggiornata funzione CalcZigZagInfill per modifiche a CalcZigZag.
2025-05-27 12:05:04 +02:00
Riccardo Elitropi 7edf4bced8 EgtGeomKernel :
- Aggiunto parametro alle funzioni per creare la FatCurve.
2025-05-27 08:28:56 +02:00
Riccardo Elitropi 4a5639780b EgtGeomKernel :
- In CalcPocketing aggiunto controllo di MaxOptSize anche sulle curve singole di lavorazione.
2025-05-22 12:02:53 +02:00
Riccardo Elitropi 0a21a582be EgtGeomKernel :
- correzione scelta basi e tempProps per le curve a trapezio.
2025-05-22 10:32:36 +02:00
Dario Sassi 0e663c02c4 EgtGeomKernel :
- piccola miglioria suggeritra da compilatore 64bit.
2025-05-21 09:34:18 +02:00
Riccardo Elitropi 21afe8165c EgtGeomKernel :
- In CalcPocketing aggiunto controllo su Feed per lati aperti
- In CalcPocketing inizio stesura funzioni per Biarchi.
2025-05-20 17:28:05 +02:00
Daniele Bariletti 0247fe5e7c Merge branch 'master' into FasterVMill5Axis 2025-05-20 11:06:49 +02:00
Daniele Bariletti 50bad83fba EgtGeomKernel :
- accorpamento del codice per Virtual milling 5assi.
2025-05-20 11:06:21 +02:00
Daniele Bariletti 9c93d6c2f3 EgtGeomKernel :
- aggiunte funzioni per le lavorazioni generiche a 5 assi.
2025-05-20 10:14:39 +02:00
Riccardo Elitropi 4d9a50cf94 Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2025-05-20 09:11:46 +02:00
Riccardo Elitropi bbdaac5d8d EgtGeomKernel :
- In CalcPocketing aggiunto controllo per angoli per segmento di entrata da fuori e aggiunto controllo con superficie limite da Offset Conformal.
2025-05-20 09:11:40 +02:00
Dario Sassi 0417c43bcf EgtGeomKernel :
- correzione a Pocketing per calcolo punto di inizio con lati aperti.
2025-05-19 17:39:26 +02:00
Riccardo Elitropi 15585b8f11 EgtGeomKernel :
- in PolygonElevation aggiunto controllo sul punto centrale della PolyLinea.
2025-05-16 15:48:41 +02:00
Daniele Bariletti 59755ec8a5 EgtGeomKernel :
- piccole correzioni.
2025-05-15 16:34:01 +02:00
Riccardo Elitropi b16dd260d8 EgtGEomKernel :
- In CalcPocketing aggiunto controllo lunghezza dei lati aperti,  aggiunto parametro MaxOptSize e aggiunte migliorie a percorsi Conformal.
2025-05-15 16:23:53 +02:00
SaraP d37a5a37b7 EgtGeomKernel :
- piccola correzione in GetSideAtMinDistPoint in un caso particolare di punto minimo nello start di curva chiusa.
2025-05-15 14:40:34 +02:00
Daniele Bariletti 79dfb4ae87 EgtGeomKernel :
- aggiunta di una funzione per  la VirtualMilling a 5 assi usando le bilineari.
2025-05-15 12:13:55 +02:00
Riccardo Elitropi 8b75b6e4c3 EgtGeomKernel :
- In CalcPocketing piccola miglioria per contorni ZigZag.
2025-05-13 11:41:08 +02:00
Riccardo Elitropi bcaad08b61 EgtGeomKernel :
- In CalcPocketing migliorata la gestione delle curve di svuotatura singole.
2025-05-09 16:08:34 +02:00
Riccardo Elitropi cbdeffd93a EgtGeomKernel :
- In CalcPocketing aggiunto merge dei percorsi nel caso di intersezione delle estensioni presso le uscite libere.
2025-05-07 15:00:04 +02:00
Riccardo Elitropi 0ce477a3e7 EgtGeomKernel :
- In CalcPocketing migliorata la gesitone delle lavorazioni Conformal
- In CalcPocketing migliorate le curve di bordo per lavorazioni OneWay e ZigZag.
2025-05-06 17:07:56 +02:00
Riccardo Elitropi 44eb4d1834 Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2025-05-05 16:57:24 +02:00
Riccardo Elitropi 2e26b73208 EgtGeomKernel :
- in CalcPocketing piccola modifica per la creazione delle curve a ricciolo per aree non svuotate.
2025-05-05 16:57:20 +02:00
Dario Sassi de3fa3201e EgtGeomKernel 2.7e1 :
- ricompilazione con cambio versione.
2025-05-05 13:25:12 +02:00
Riccardo Elitropi f068aafbb5 Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2025-05-05 12:25:16 +02:00
Riccardo Elitropi daedb07135 EgtGeomKernel :
- in CalcPocketing, aggiunta inversione del percorso per spirali in lavorazione SPIRAL_OUT.
2025-05-05 12:25:12 +02:00
SaraP 702e1e446d EgtGeomKernel :
- piccole correzioni nelle approssimazioni delle curve.
2025-04-28 15:14:05 +02:00
SaraP ea87db1ae1 EgtGeomKernel :
- negli offset gestite autointersezioni per raccordi chamfer ed extend.
2025-04-24 14:12:34 +02:00
Dario Sassi b65800843a EgtGeomKernel :
- proiezione curve su superficie ora accetta più superfici.
2025-04-23 12:18:16 +02:00
Dario Sassi e4c5d8645d Merge commit '85b06c29b4bf9af0f6c54bfa74ff2dd38c1103bd' 2025-04-22 18:01:34 +02:00
Daniele Bariletti 85b06c29b4 Merge branch 'FasterBezier_NoMultiThread' 2025-04-22 14:56:42 +02:00
Daniele Bariletti 5254d0c5ca EgtGeomKernel :
- rimosso header di debug.
2025-04-22 14:56:18 +02:00
Daniele Bariletti 292c2bf87a EgtGeomKernel :
- piccola correzione.
2025-04-22 11:43:47 +02:00
Dario Sassi 9d038142a8 Merge remote-tracking branch 'origin/master' 2025-04-21 10:03:06 +02:00
Dario Sassi c5573e438b EgtGeomKernel 2.7d2 :
- in VolZmap migliorato calcolo step per Vmill 4assi.
2025-04-21 10:01:41 +02:00
Daniele Bariletti 8c7a0ac026 Merge branch 'FasterBezier_NoMultiThread' 2025-04-14 11:23:11 +02:00
Daniele Bariletti e45bbf2afd EgtGeomKernel:
- piccola correzione.
2025-04-14 11:22:56 +02:00
Daniele Bariletti fc6de68d83 Merge branch 'master' into FasterBezier_NoMultiThread 2025-04-14 09:01:39 +02:00
Daniele Bariletti a008c169ae EgtGeomKernel :
- aggiunta seconda trimesh alle bezier.
2025-04-14 09:01:15 +02:00
SaraP 3cd6c9299f EgtGeomKernel :
- correzione riferimenti in CalcSpecialPointOffset.
2025-04-11 16:41:13 +02:00
Daniele Bariletti 8e5801d656 Merge remote-tracking branch 'origin/HEAD' into FasterBezier_NoMultiThread 2025-04-11 16:02:12 +02:00
Daniele Bariletti 1691b7f84a EgtGeomKernel: - correzione al taglio di superfici di bezier con piani. 2025-04-11 16:01:14 +02:00
Daniele Bariletti 76e4197729 EgtGeomKernel:
- correzione errori nel taglio con piani di Surf di bezier.
2025-04-11 11:27:38 +02:00
Daniele Bariletti fb8bac8681 EgtGeomKernel:
- correzione di un errore di taglio con piani nelle surf Bezier.
2025-04-10 15:34:57 +02:00
Daniele Bariletti 55a9685add EgtGeomKernel:
- piccole correzioni.
2025-04-08 15:34:48 +02:00
Dario Sassi afa4be3717 EgtGeomKernel :
- modifiche solo estetiche.
2025-04-08 13:07:57 +02:00
Daniele Bariletti 57c03a54c9 Merge branch 'master' into FasterBezier_NoMultiThread 2025-04-08 12:56:30 +02:00
SaraP 91a9adaea4 EgtGeomKernel 2.4d1 :
- in OffsetCurve aggiunta funzione che restituisce punto di offset nel caso in cui non siano calcolabili curve
- correzione offset Voronoi nel caso di arco con raggio minore di EPS.
2025-04-08 08:37:20 +02:00
Daniele Bariletti 8657fa32c5 Merge remote-tracking branch 'origin/master' into FasterBezier_NoMultiThread 2025-04-07 10:21:23 +02:00
Dario Sassi b7a4f0bff3 EgtGeomKernel :
- a SurfTriMesh aggiunto metodo CreateByPolygonWithHoles.
2025-03-28 20:17:50 +01:00
Dario Sassi f0716e2727 EgtGeomKernel 2.7c4 :
- aggiunte funzioni GetSurfTriMeshPyramidFrustum e GetSurfTriMeshConeFrustum
- modificata funzione GetSurfTriMeshPyramid per origine ora in centro alla base.
2025-03-27 15:25:07 +01:00
Dario Sassi b1acf7f4f0 EgtGeomKernel :
- correzione a Inters3Planes (la linea deve essere infinita)
- modifiche varie e correzioni a ProjectCurveOnSurf per gestire spigoli e per far funzionare l'eliminazione dei punti superflui.
2025-03-26 11:26:36 +01:00
Daniele Bariletti 851c053f7c - pulizia del codice. 2025-03-25 12:37:13 +01:00
Daniele Bariletti 71276a8de3 - ottimizzazione del codice e gestione delle copie di polyline nel tree. 2025-03-25 12:17:06 +01:00
Daniele Bariletti b2e799e1d6 - ulteriore riduzione di copie di costruzione e copie di polyline in tree. 2025-03-24 12:42:56 +01:00
Daniele Bariletti eb9aaef53a - riduzione del numero di copie di polyline nel tree di una bezier. 2025-03-24 10:09:39 +01:00
Dario Sassi 49340d2629 EgtGeomKernel :
- in CollisionAvoid aumentato MAX_MOVE per calcoli con travi (elevazione su attacchi/uscite).
2025-03-17 15:11:34 +01:00
Daniele Bariletti 0b9c9f375c - aggiunta mappa per il calcolo dei punti 3d di una bezier. 2025-03-17 14:19:08 +01:00
Daniele Bariletti cd56f80790 - piccola modifica alla mappa dei polinomi di bernstein. 2025-03-17 14:19:03 +01:00
Riccardo Elitropi 65d826168b EgtGeomKernel :
- In ConformalZigZag piccola modifica sulla tolleranza della regione limite.
2025-03-17 09:55:22 +01:00
Riccardo Elitropi ea012988df EgtGeomKernel :
- aggiunto parametro in CalcPocketing.
2025-03-13 12:32:35 +01:00
Dario Sassi 67f3df353f EgtGeomKernel 2.7c2 :
- in CAvToolSurfTm caso singola posizione da controllare utilizzo HashGrid3d delle superfici tramite GetAllTriaOverlapBox.
2025-03-12 15:27:33 +01:00
Daniele Bariletti 9d34df708d - piccole correzioni
- passaggio da key int, double a int, int per la mappa di Bernstein per le bezier.
2025-03-12 12:43:10 +01:00
Daniele Bariletti 72947f1e36 Merge remote-tracking branch 'origin/HEAD' into FasterBezier 2025-03-12 09:41:01 +01:00
Daniele Bariletti 1cdae73b24 - aggiunta del membro statico per tenere in cache i polinomi di bernstein
- allocazione della memoria per il calcolo di bernstein fatto solo una volta per superficie.
2025-03-11 14:48:34 +01:00
Riccardo Elitropi a2825b2b6d EgtGeomKernel :
- migliorie MarchingSquares, semplificazione funzioni per CAv.
2025-03-11 11:17:30 +01:00
Daniele Bariletti 5bc7036e98 - miglioria per la copia di SurfBezier. 2025-03-10 12:40:36 +01:00
Daniele Bariletti 7e545aecd7 Merge branch 'master' of https://gitlab.steamware.net/egalware-cadcam/libreriebase/EgtGeomKernel 2025-03-07 09:18:10 +01:00
Daniele Bariletti 0fc8291ef5 - piccola miglioria a test per concatenamento. 2025-03-07 09:17:38 +01:00
Dario Sassi 0d668c1a4a EgtGeomKernel :
- piccola miglioria a test per concatenamento.
2025-03-06 20:10:38 +01:00
Daniele Bariletti 4b1270f231 Merge branch 'master' of https://gitlab.steamware.net/egalware-cadcam/libreriebase/EgtGeomKernel 2025-03-05 12:21:56 +01:00
Daniele Bariletti 9263dc0516 - modifica alla scelta del punto di start per le compo create come chain. 2025-03-05 12:21:50 +01:00
Riccardo Elitropi b0f7cb93fd EgtGeomKernel :
- Aggiunto parametro in CalcPocketing.
2025-03-04 17:42:53 +01:00
Riccardo Elitropi add3788db4 Merge commit '37c23faae3082033a87a89f1f7332ab5593356b6' 2025-03-04 17:24:09 +01:00
SaraP 37c23faae3 EgtGeomKernel 2.7c1 :
- aggiunta triangolazione con FIST.
2025-03-04 16:55:33 +01:00
Riccardo Elitropi fa6f12ba3b EgtGeomKernel :
- In CalcPocketing ConformalZigZag, piccola modifica alla tolleranza per riconoscimento lati Open/Close.
2025-03-03 12:04:30 +01:00
Riccardo Elitropi 730dd396f4 EgtGeomKernel :
- In CalcPocketing aggiunto parametro per ottimizzazione Offsets
- In CavToolSurfTm aggiunta funzione per Test griglia di punti con parametro di alzata dell'utensile e normali dei triangoli coinvolti
- In SurfTriMesh aggiunta funzione per calcolo dei Loop su una Part specifica.
2025-02-21 11:09:45 +01:00
Riccardo Elitropi 3b9f6773f2 EgtGeomKernel :
- in CalcPocketing piccola modifica nella creazione della superficie di incidenza.
2025-02-03 15:31:41 +01:00
Dario Sassi 97315f6ca4 EgtGeomKernel 2.7a3 :
- ricompilato con nuova libreria VRONI 7.8.
2025-01-29 16:47:07 +01:00
Riccardo Elitropi b2be420e36 EgtGeomKernel :
- in CalcPocketing Conformal migliorata la gestione delle entrate.
2025-01-28 08:35:09 +01:00
Riccardo Elitropi 4ee34b79f8 EgtGeomKernel :
- In CalcPocketing, piccola correzione nel calcolo dei Link per ConformalZigZag.
2025-01-27 10:24:43 +01:00
Riccardo Elitropi e4ee403d24 EgtGeomKernel :
- correzione tool avanzato per collisioni in calcolo di Silhouette.
2025-01-24 17:07:23 +01:00
Dario Sassi b709776f5f EgtGeomKernel :
- piccole mdofiche poco più che estetiche.
2025-01-20 08:30:39 +01:00
SaraP b5a2490fd4 EgtGeomKernel :
- piccola correzione triangolazione avanzata.
2025-01-17 12:21:25 +01:00
SaraP 7a18cd1c5c EgtGeomKernel :
- correzione offset con Voronoi nel caso di tratti infinitesimi consecutivi.
2025-01-17 09:03:55 +01:00
Dario Sassi 26e1448bbb EgtGeomKernel :
- unificata proiezione di curve su superfici trimesh e bezier.
2025-01-15 15:21:18 +01:00
Dario Sassi a1ebdb4eb6 EgtGeonKernel :
- piccola ulteriore miglioria in CalcAuxSurf di Region.
2025-01-14 18:52:56 +01:00
Dario Sassi 6603061f81 EgtGeomKernel :
- migliorato calcolo Trimesh associata a Region mediante eliminazione di isole piccole.
2025-01-14 18:22:15 +01:00
Dario Sassi 1c3d7bf2a6 EgtGeomKernel :
- piccole migliorie alle funzioni ProjectCurveOnSurfTm.
2025-01-14 08:45:26 +01:00
Riccardo Elitropi a4a030b776 EgtGeomKernel :
- In CalcPocketing migliorata la gestione dei lati aperti, migliorati i percorsi Conformal e di raccordo per gli smussi.
2025-01-10 16:42:42 +01:00
Dario Sassi 64a8294ea0 EgtGeomKernel :
- corretta intersezione tra segmenti di retta quasi paralleli
- aggiunte verifiche su Fillet e Chamfer.
2025-01-10 16:26:40 +01:00
Dario Sassi 847383d82d EgtGeomKernel 2.7a1 :
- cambio annuale di versione
- NurbsToBezierCurve ora aggiusta i valori dei nodi agli estremi (anzichè controllarli)
- compilazione 32bit senza più limiti per Windows XP.
2025-01-09 17:57:57 +01:00
Riccardo Elitropi c16d916a63 EgtGeomKernel :
- inizializzazione offset radiale per Silhouettes.
2025-01-07 13:25:21 +01:00
Riccardo Elitropi 91cae44533 EgtGeomKernel :
- in Silhouette, corretto offset radiale per altezze utensili.
2025-01-07 12:16:34 +01:00
Dario Sassi 56c3e28ac3 EGtGeomKernel :
- piccola modifica estetica.
2025-01-06 18:16:46 +01:00
Riccardo Elitropi 3238c86cec EgtGeomKernel :
- In CalcPocketing piccola correzione per estensione lati aperti e migliorie lavorazioni Conformal.
2024-12-31 12:01:36 +01:00
Riccardo Elitropi f050e682ef EgtGeomKernel :
- In CalcPocketing, piccola correzione per i casi a Trapezio.
2024-12-30 18:01:16 +01:00
Riccardo Elitropi 01c875b34f EgtGeomKernel :
- Semplificazione Silhouette con regioni piane.
2024-12-30 16:12:26 +01:00
Riccardo Elitropi 50b8a8aa94 in CalcPocketing :
- migliorati percorsi conformal ZigZag/OneWay
- migliorie varie.
2024-12-24 17:25:58 +01:00
SaraP 9f1aad5e49 EgtGeomKernel 2.6l3 :
- in CurveGetAreaXY aggiunto calcolo dell'area degli archi per eliminare approssimazione con polylines.
2024-12-18 16:47:02 +01:00
Riccardo Elitropi a38c50197b - In CalcPocketing migliorati i controlli per lavorazioni conformal
- In CAvSilhouette aggiunte funzioni per calcolo silhouette all'interno di una regione piana.
2024-12-12 11:48:40 +01:00
Dario Sassi fe54dde44e EgtGeomKernel :
- in Vmill corretti controlli per velocizzazione taglio dexel con cilindri.
2024-12-10 10:57:36 +01:00
Dario Sassi 62a3405d6a EgtGeomKernel 2.6l2 :
- tolta da interfaccia ISurfTriMesh il metodo CreateByRegion (usare al suo posto la funzione GetSurfTriMeshByRegion)
- aggiunta la funzione GetSurfTriMeshEmpty.
2024-12-04 15:04:26 +01:00
Dario Sassi cb9dd807ce EgtGeomKernel 2.6l1 :
- aggiunta funzione FlattenInAutoPlane per spianare la polilinea sul suo piano medio.
2024-11-29 18:52:42 +01:00
Dario Sassi d60d38a24b Revert "EgtGeomKernel 2.6i1 :"
This reverts commit e598e7986f.
2024-11-29 18:22:48 +01:00
Dario Sassi e598e7986f EgtGeomKernel 2.6i1 :
- aggiunta funzione FlattenAdv per spianare la polilinea sul suo piano medio.
2024-11-29 18:17:40 +01:00
Riccardo Elitropi 9bebd2f2ad Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2024-11-27 16:02:26 +01:00
Riccardo Elitropi 36d5c39094 EgtGeomKernel:
- in calcolo della Silhouette aggiunti casi ambigui, aggiunta funzione per controllo di sharpedEdges e migliorati i controlli di approssimazione.
2024-11-27 16:02:22 +01:00
Dario Sassi 1b08f4bbdd EgtGeomKernel :
- correzione calcolo PCA per punti (aumentata precisione).
2024-11-27 15:31:45 +01:00
SaraP 4a952b1c9b EgtGeomKernel :
- ulteriore correzione Voronoi.
2024-11-26 15:53:09 +01:00
SaraP 7a25927054 EgtGeomKernel 2.6k2 :
- in Voronoi migliorata la crezione di archi dervianti dall'offset
- in CurveArc::Set2PRS aggiunta normalizzazione vettore per gestire semicirconferenze con raggi piccoli.
2024-11-26 14:48:21 +01:00
SaraP cf022921a7 EgtGeomKernel 2.6k1 :
- in GetSilhouette ripristinato l'offset di tipo fillet ed extend per sistemare imprecisioni sugli spigoli.
2024-11-15 10:21:53 +01:00
Dario Sassi dc798aaaba EgtGeomKernel :
- in Vmill ulteriore velocizzazione nel taglio dexel con cilindri.
2024-10-29 18:39:52 +01:00
Dario Sassi eed89dab37 EgtGeomKernel 2.6j4 :
- in Vmill velocizzato taglio dexel con cilindri di grande diametro (come le lame).
2024-10-29 16:51:32 +01:00
Dario Sassi 990bc1a1e4 EgtGeomKernel :
- migliorato controllo precisione percorsi per proiezione curve su superfici.
2024-10-25 17:18:59 +02:00
Riccardo Elitropi 03433fe3af EgtGeomKernel :
- in CalcPocketing, aggiunto controllo sulla regione di incidenza.
2024-10-22 09:38:30 +02:00
Riccardo Elitropi e02611504b EgtGeomKernel :
- In CalcPocketing migliorato controllo per entrate da fuori
- corretta gestione delle curve singole di svuotatura.
2024-10-18 11:26:21 +02:00
SaraP a835433be4 EgtGeomKernel 2.6j3 :
- aggiunte funzioni per calcolare offset come curve singole con Voronoi.
2024-10-16 16:28:32 +02:00
Dario Sassi da8f40db17 EgtGeomKernel 2.6j1 :
- ricompilazione con cambio versione.
2024-10-10 15:43:05 +02:00
Riccardo Elitropi 5468e3f4fa EgtGeomKernel :
- in CalcPocketing rilassati i vincoli sulla regione di incidenza dei lati aperti e migliorata la gestione delle curve singole.
2024-10-10 13:02:42 +02:00
Daniele Bariletti 88684e305f Merge branch 'MoreBezier' 2024-10-04 15:40:24 +02:00
Daniele Bariletti f8ca8029d7 Merge remote-tracking branch 'origin/HEAD' into MoreBezier 2024-10-04 15:20:46 +02:00
Daniele Bariletti aa9c46cbb5 EgtGeomKernel :
- aggiunte la surfBz SweptInPlane e Swept3D.
2024-10-04 15:20:31 +02:00
Daniele Bariletti f0cf3c9559 EgtGeomKernel :
- rimozione memory leak
- corretto bug nella triangolazione bezier.
2024-10-04 14:57:23 +02:00
Riccardo Elitropi 9a638b9470 EgtGeomKernel :
- In CalcPocketing corretti errori per casi a trapezio
- migliorata la gestione delle curve singole di svuotatura.
2024-10-04 12:57:20 +02:00
Dario Sassi b07fbfc72e Merge commit 'a98b6bcc09a707b1c42a025b8e85a85801465f08' 2024-10-02 17:26:01 +02:00
Dario Sassi 0317c37557 EgtGeomKernel 2.6j1 :
- piccoli ritocchi a superfici di Bezier.
2024-10-02 17:25:24 +02:00
Riccardo Elitropi a98b6bcc09 EgtGeomKernel :
- in CalcPocketing estesi i percorsi OneWay
- piccole migliorie su selezione punto iniziale per curve singole.
2024-10-02 13:13:16 +02:00
Riccardo Elitropi c19861a911 Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2024-10-01 12:41:19 +02:00
Riccardo Elitropi 8f8597d442 EgtGeomKernel :
- In CalcPocketing, piccola modifica in lavorazioni Conformal.
2024-10-01 12:41:15 +02:00
Dario Sassi 0c0eb9ef8f EgtGeomKernel 2.6i2 :
- ricompilazione con cambio versione.
2024-09-26 19:58:03 +02:00
Riccardo Elitropi 4ffb7087bd EgtGeomKernel :
- In CalcPocketing, migliorati i percorsi Conformal.
2024-09-26 12:22:51 +02:00
Dario Sassi dc070c4556 EgtgeomKernel :
- aggiunta funzione GetLoopCurveCount a FlatRegion.
2024-09-23 13:01:07 +02:00
Riccardo Elitropi 60729d5f39 EgtGeomKernel :
- Semplificazione codice in CalcPocketing.
2024-09-20 09:29:02 +02:00
SaraP da7e9dd6e2 EgtGeomKernel :
- aggiunte funzioni per calcolare Voronoi e medial axis di più curve.
2024-09-19 16:28:19 +02:00
Riccardo Elitropi aeff9fb418 EgtGeomKernel :
- in sgrossature, aggiunta modalità CONFORMAL_ZIGZAG e CONFORMAL_ONEWAY.
2024-09-19 09:06:40 +02:00
Daniele Bariletti e9e897593b EgtGeomKernel :
- modificata la CreateBySetOfCurves.
2024-09-17 17:27:31 +02:00
Daniele Bariletti bfc09d135c EgtGeomKernel :
- aggiunta la funzione IsLine per le bezier
- aggiunta funzione SurfBzSweptInPlane
- aggiunta la funzione InterpolatePointSetWithBezier.
2024-09-17 17:19:20 +02:00
SaraP 0998d0fffc EgtGeomKernel :
- correzione errore nel calcolo offset con Voronoi.
2024-09-10 16:17:50 +02:00
Daniele Bariletti 93c87ee720 EgtGeomKernel :
- correzione alla triangolazione delle bilineari bezier.
2024-09-10 12:30:01 +02:00
Daniele Bariletti a67a0502fa EgtGeomKernel :
- correzioni alla triangolazione di una surf di bezier (split iniziale).
2024-09-10 09:19:28 +02:00
Daniele Bariletti cec0a48be4 EgtGeomKernel :
- correzione alla SurfBzByScrewing.
2024-09-10 09:18:21 +02:00
Daniele Bariletti 0cc63d40eb EgtGeomKernel :
- piccole correzioni
- tolti commenti.
2024-09-10 09:17:59 +02:00
Dario Sassi 623eb6e630 EgtGeomKernel 2.6i1 :
- ricompilazione con cambio versione.
2024-09-05 17:37:54 +02:00
Dario Sassi 1f22299096 Merge commit '3f6c439983dee4957cb04a9b69dd01492ef38954' 2024-09-05 17:10:03 +02:00
Daniele Bariletti 3f6c439983 Merge branch 'MoreBezier' 2024-09-05 15:03:27 +02:00
Daniele Bariletti 8e22267476 EgtGeomKernel :
- piccole correzioni.
2024-09-05 12:13:28 +02:00
Daniele Bariletti aa2b6ccde5 EgtGeomKernel :
- modifica degli argomenti della funzione CalcRegionPolyLines.
2024-09-05 12:09:28 +02:00
Daniele Bariletti ec6cb79a8d EgtGeomKernel :
- correzione alla SurfTmByRegionExtrusion
- correzione alla SurfBzByScrewing.
2024-09-05 11:37:24 +02:00
Daniele Bariletti 76dceb4fc9 EgtGeomKernel :
- aggiunto un commento.
2024-09-05 08:53:15 +02:00
Daniele Bariletti b1564f7de0 EgtGeomKernel :
- aggiunto un commento.
2024-09-05 08:52:57 +02:00
Daniele Bariletti 21e4bd6d93 Merge branch 'master' into MoreBezier 2024-09-04 15:56:45 +02:00
Daniele Bariletti 2101d72abe Merge branch 'MoreBezier' 2024-09-04 15:50:24 +02:00
Daniele Bariletti 7a01f67c8b EgtGeomKernel :
- aggiunto un argomento alla CalcRegionPolyLines.
2024-09-04 15:50:01 +02:00
Daniele Bariletti 2267343afe EgtGeomKernel :
- correzione ai CopyFrom di CurveComposite e di SurfBezier.
2024-09-04 08:57:39 +02:00
Daniele Bariletti 9a5fe24781 EgtGeomKernel :
- correzione alle SbzByRegion.
2024-09-03 09:25:17 +02:00
Daniele Bariletti 4050aa11c5 EgtGeomKernel :
- aggiunto un limite di iterazioni per l'approssimazione con bezier cubiche
- correzione alla MakeNonRational.
2024-09-02 09:47:45 +02:00
Daniele Bariletti b75ddae396 Merge branch 'MoreBezier' 2024-08-30 16:16:25 +02:00
Daniele Bariletti 2d3f8487ee Merge remote-tracking branch 'origin/HEAD' into MoreBezier 2024-08-30 15:04:46 +02:00
SaraP 964647d7e6 EgtGeomKernel 2.6h3 :
- estensione del calcolo degli offset con Voronoi al caso di più curve scollegate tra loro.
2024-08-30 14:49:47 +02:00
Daniele Bariletti f78dd0fa83 EgtGewomKernel :
- correzione alle curve di bezier.
2024-08-30 14:46:59 +02:00
Daniele Bariletti 55ce22b06c EgtGeomKernel :
- piccoli aggiustamenti stilistici.
2024-08-29 10:05:45 +02:00
Daniele Bariletti 50df4f3503 Merge branch 'master' into MoreBezier 2024-08-29 09:23:08 +02:00
Daniele Bariletti 5c8f0c79f6 Merge commit '2b4090619bd13636d11a1684cd19a5b8a1ca4539' into MoreBezier 2024-08-29 09:21:42 +02:00
Daniele Bariletti de3f187ddf EgtGeomKernel :
- unificazione del codice per la CalcRegionPolyLines e modifiche collegate.
2024-08-29 09:20:00 +02:00
Daniele Bariletti f649954ee1 EgtGeomKernel :
- pulizia codice.
2024-08-28 09:35:27 +02:00
Daniele Bariletti 6e08f2a878 EgtGeomKernel :
- modifica alla MakeNonRational
- modifica alla EditCurveBezier ( si può scegliere liberamente il grado)
- aggiunte funzioni per uniformare le curve da usare per la creazione di sup di Beizer.
- piccola correzione alla triangolazione.
2024-08-26 17:07:51 +02:00
Dario Sassi 887922a715 EgtGeomKernel :
- migliorie a CalcAuxSurf di SurfFlatRegion (per casi di piccolissima dimensione).
2024-08-23 18:59:40 +02:00
Dario Sassi 640fef2e0a Merge commit '4f3fe68283f537bb933439a78ef909025408c904' 2024-08-23 09:21:22 +02:00
Daniele Bariletti 1a338a1a82 EgtGeomKernel :
- aggiunte le approssimazioni di bezier con bezier cubiche.
2024-08-22 15:57:53 +02:00
Riccardo Elitropi 4f3fe68283 EgtGeomKernel :
- aggiunta in CalcPocketing la gestione dei punti iniziali
- migliorie varie.
2024-08-22 12:54:25 +02:00
Dario Sassi 3908e11d18 EgtGeomKernel 2.6h2 :
- modifiche per permettere Mark di tipo 2.
2024-08-22 09:10:04 +02:00
Daniele Bariletti 4e6c5112e4 EgtGeomKernel :
- aggiunta di funzioni e modifica di funzioni per la gestione delle curve di bezier.
2024-08-09 17:35:47 +02:00
Daniele Bariletti e1ab88302f EgtGeomKernel :
- correzioni e miglioramenti alla triangolazione delle bezier.
2024-08-09 17:33:26 +02:00
Riccardo Elitropi 2b4090619b EgtGeomKernel :
- In CalcPocketing miglorate le Feed, le regioni non svuotate e le lavorazioni ConformalZigZag.
2024-08-06 15:11:11 +02:00
Dario Sassi b90289e42b EgtGeomKernel :
- piccole velocizzazioni per biarchi
- modifiche per unificazioni AreSamePoint***.
2024-08-06 14:42:25 +02:00
SaraP 5e84408685 EgtGeomKernel 2.6h1 :
- migliorato calcolo distanza nell'approssimazione con archi.
2024-08-05 16:50:35 +02:00
Daniele Bariletti b53c2f833a Merge branch 'MoreBezier' 2024-08-05 10:07:42 +02:00
Daniele Bariletti b5fcceaa75 Merge branch 'master' into MoreBezier 2024-08-05 08:46:27 +02:00
Daniele Bariletti f0bfbb6c85 EgtGeomKernel :
- correzioni e migliorie alla triangolazione con le bezier.
2024-08-02 15:12:35 +02:00
Daniele Bariletti 2710f735d1 EgtGeomKernel :
- correzioni e migliorie alla triangolazione delle bezier.
2024-08-01 16:24:16 +02:00
Daniele Bariletti ddffbd2c88 EgtGeomKernel :
- correzioni e migliorie alla triangolazione delle bezier.
2024-07-31 17:43:18 +02:00
SaraP fde952499d EgtGeomKernel :
- correzione in AssociatePolyLinesMinDistPoints.
2024-07-31 14:22:22 +02:00
Riccardo Elitropi b28102a8cc EgtGeomKernel :
In CalcPocketing per lavorazioni CONFORMAL_ZIGZAG aggiunta gestione aree non svuotate.
2024-07-30 18:34:37 +02:00
Daniele Bariletti f46db233dc EgtGeomKernel :
- ottimizzazione della triangolazione bezier.
2024-07-30 16:23:35 +02:00
Riccardo Elitropi df10b45c6b EgtGeomKernel :
- in CalcPocketing aggiunta lavorazione CONFORMAL_ZIGZAG
- migliorie varie.
2024-07-30 14:01:17 +02:00
Daniele Bariletti 1b13580340 EgtGeomKernel :
- correzioni alla triangolazione con le bezier.
2024-07-29 17:32:04 +02:00
Daniele Bariletti 742305b99b EgtGeomKernel :
- correzioni e miglioramenti alla triangolazione delle bezier.
2024-07-29 15:25:28 +02:00
Dario Sassi 1261de4dbb EgtGeomKernel 2.6g6 :
- ricompilazione con cambio versione.
2024-07-29 10:14:02 +02:00
Daniele Bariletti b50588f974 EgtGeomKernel :
- correzioni e migliorie alla triangolazione delle bezier.
2024-07-26 17:28:29 +02:00
Daniele Bariletti 9b87de9fa2 EgtGeomKernel :
- correzioni e migliorie alla triangolazione con le bezier.
2024-07-25 16:25:05 +02:00
Riccardo Elitropi 5bab4a9aa8 EgtGeomKernel :
- aggiunti percorsi di bordo In CalcPocketing per ZigZag e OneWay
- correzione punti per entrate
- migliorie varie.
2024-07-25 12:30:08 +02:00
Daniele Bariletti c3e7d3d8c7 EgtGeomKernel :
- miglioramenti alla triangolazione delle bezier.
2024-07-24 10:13:45 +02:00
Daniele Bariletti 89c22ffd06 EgtGeomKernel :
- correzioni e miglioramenti per la triangolazione bezier.
2024-07-24 09:27:38 +02:00
Riccardo Elitropi 5375752609 EgtGeomKernel :
- in CalcPocketing aggiunto un frame Locale XY per semplificazione conti e migliorata la gestione della svuotature a trapezio.
2024-07-23 11:52:43 +02:00
Daniele Bariletti 0a8f26c993 EgtGeomKernel :
- correzioni alla triangolazione delle bezier.
2024-07-23 09:47:19 +02:00
Riccardo Elitropi cba9c253e1 Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2024-07-22 11:46:43 +02:00
Riccardo Elitropi 71f3bf8809 EgtMachKernel :
- in calcPocketing, migliorata la gestione di superfici con isole sia aperte che chiuse, gestito caso di circonferenza tutta aperta e modifica del parametro MinSafe.
2024-07-22 11:46:39 +02:00
Daniele Bariletti d491536eb4 EgtGeomKernel :
- piccola aggiunta al CopyFrom delle Surf Bezier.
2024-07-22 11:18:32 +02:00
Daniele Bariletti e68465c80b EgtGeomKernel :
- piccola aggiunta al CopyFrom delle Surf Bezier.
2024-07-22 11:18:01 +02:00
Daniele Bariletti dfb8fd2160 EgtGeomKernel :
- correzione bug nella triangolazione bezier.
2024-07-22 10:27:24 +02:00
Daniele Bariletti 746fa61e08 EgtGeomKernel :
- aggiunta dell'uniformazione delle curve in preparazione ad una superficie skinned.
2024-07-22 10:26:51 +02:00
Daniele Bariletti d0e0c46e2c EgtGeomKernel :
- correzione bug nella triangolazione bezier.
2024-07-22 10:22:36 +02:00
Daniele Bariletti 19c7f63303 EgtGeomKernel :
- generalizzazione della skinned con bezier.
2024-07-19 16:59:47 +02:00
Daniele Bariletti 87f6a29db3 EgtGeomKernel :
- aggiunte le skinned con le Bezier.
2024-07-19 13:13:45 +02:00
Riccardo Elitropi b04d1ed7a9 EgtGeomKernel :
- migliorie nella gestione dei lati Aperti/Chiusi in CalcPocketing.
2024-07-19 12:01:58 +02:00
Dario Sassi 54dba7ab41 EgtGeomKernel 2.6g5 :
- aggiunta classe DistPointSurfFr (distanza punto regione)
. a SurfFlatRegion aggiunte funzioni EraseChunk, GetChunkArea, GetChunkPerimeter, ResetAllCurveTempProps e ResetAllCurveTempParams
- piccoli adattamenti in CalcPocketing.
2024-07-18 20:18:18 +02:00
Daniele Bariletti 146c06d27f Merge branch 'master' into MoreBezier 2024-07-17 16:22:19 +02:00
Daniele Bariletti 7c45c1e287 EgtGeomKernel :
- aggiustamenti alla Bezier By Contour.
2024-07-17 16:18:18 +02:00
Daniele Bariletti d6dc5b8428 Merge branch 'master' of https://gitlab.steamware.net/egalware-cadcam/libreriebase/EgtGeomKernel 2024-07-17 09:10:07 +02:00
Daniele Bariletti 28695f9138 EgtGeomKernel :
- piccola modifica alle funzioni per creare superfici di Bezier.
2024-07-17 09:10:03 +02:00
Dario Sassi 66cec4a872 EgtGeomKernel :
- ridotte tolleranze su tangenza in intersezione archi.
2024-07-17 09:00:33 +02:00
Dario Sassi 8d1d3f766a EgtGeomKernel :
- irrobustita funzione IsClosedAndFlat di PolyLine (facendo i conti rispetto al baricentro)
- per Regioni quando si aggiune il loop esterno, se risulta formato da più parti disgiunte (per autonitersezioni) si ignorano quelle molto piccole.
2024-07-16 08:38:40 +02:00
Dario Sassi befed079c8 Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2024-07-15 18:51:13 +02:00
Daniele Bariletti b9138029db EgtGeomKernel 2.6g3 :
- aggionamento versione.
2024-07-15 17:34:11 +02:00
Daniele Bariletti 2246dbc284 Merge branch 'MoreBezier' 2024-07-15 17:30:17 +02:00
Dario Sassi 67180b3569 Merge commit '4748bd5ac888a0ae6b9381c40bad0aaf01df73aa' 2024-07-15 17:11:30 +02:00
Daniele Bariletti 3a2aa2c679 Merge branch 'master' into MoreBezier 2024-07-15 17:06:16 +02:00
Daniele Bariletti 9dd4e043d4 EgtGeomKernel :
- correzione bug nelle rigate con le Bezier.
2024-07-15 17:05:44 +02:00
Riccardo Elitropi 4748bd5ac8 EgtGeomKernel :
- In CalcPocketing corretta la gestione delle isole aperte mediante MaxOffset.
2024-07-15 13:28:14 +02:00
Daniele Bariletti 649f97e933 EgtGeomKernel :
- correzione bug di triangolazione bezier.
2024-07-15 10:04:48 +02:00
Dario Sassi 21feed172d EgtGeomKernel :
- in CollisionAvoid corretto assegnamento riferimento (da fare prima del calcolo di hashgrids)
- in CalcPocketing corretti i punti che lasciavano memory leaks e migliorie stilistiche varie.
2024-07-15 07:08:11 +02:00
Riccardo Elitropi e853ff7f13 Aggiunto parametro per evitare casi ottimizzati 2024-07-12 20:09:04 +02:00
Riccardo Elitropi 95ff8b21b9 EgtGeomKernel :
- In CalcPocketing aggiunta funzione per Chain delle curve singole di svuotatura
- Inversione dei percorsi per lavorazione utensile
- Migliorati i controlli per le entrate da fuori.
2024-07-12 16:29:53 +02:00
Dario Sassi a7be952e11 EgtGeomKernel :
- in Pocketing, alla fine di CalcSpiral aggiunto reset dei TempProp delle curve componenti i percorsi risultanti.
2024-07-12 13:49:20 +02:00
Daniele Bariletti 7a67ce9333 Merge branch 'master' into MoreBezier 2024-07-12 12:07:26 +02:00
Daniele Bariletti 695350d3f6 EgtGeomKernel :
- correzione per evitare errori di triangolazione in prossimità dei poli in sup di Bezier.
2024-07-12 12:04:41 +02:00
Dario Sassi aade1d19f1 EgtGeomKernel :
- correzioni alle HashGrids per evitare problemi con memoria
- ottimizzazione calcolo CollisionAvoid con TestSeries e TestPath fatti di seguito
- piccole milgiorie a Pocketing.
2024-07-12 08:46:00 +02:00
Dario Sassi fd4677d099 EgtGeomKernel :
- piccola modifica in svuotature (tolto controllo di offset negativo).
2024-07-11 09:00:21 +02:00
Daniele Bariletti f7a28447fb EgtGeomKernel :
- correzione alla triangolazione delle bezier.
2024-07-10 16:41:34 +02:00
Daniele Bariletti 79b470b18b EgtGeomKernel :
- correzione alle rigate con Bezier.
2024-07-10 16:41:07 +02:00
Riccardo Elitropi f6d3873ecb EgtGeomKernel :
- In CalcPocketing, aggiunta inversione dei percorsi.
2024-07-10 12:35:20 +02:00
Riccardo Elitropi 92a8cdad99 EgtGeomKernel :
- in CalcPocketing aggiunto calcolo della Feed per percorsi a curva singola.
2024-07-10 10:24:23 +02:00
Daniele Bariletti 0c346e2bc7 Merge branch 'master' into MoreBezier 2024-07-10 08:53:12 +02:00
Daniele Bariletti d54caf4ae3 EgtGeomKernel :
- pulizia codice.
2024-07-10 08:52:47 +02:00
Dario Sassi ff9ea34ae1 EgtGeomKernel :
- in TestPosition di CollisionAvoid possibilità di restituire normale alla superficie nell'ultimo punto di contatto.
2024-07-09 16:48:54 +02:00
Daniele Bariletti c7035305e2 EgtGeomKernel :
- correzione alle rigate Bezier nella modalità MinDist.
2024-07-09 15:47:47 +02:00
Daniele Bariletti bc3c1e377e EgtGeomKernel :
- corretta la ruled con bezier in modalità MinDistPlus.
2024-07-09 13:04:48 +02:00
Riccardo Elitropi 98eff1b0b9 EgtGeomKernel :
- in CalcPocketing pulizia del codice e migliorie varie.
2024-07-09 11:10:49 +02:00
SaraP 052cc9e841 EgtGeomKernel 2.6g2 :
- aggiornamento versione.
2024-07-09 10:30:51 +02:00
SaraP b6a7ce4eef EgtGeomKernel :
- aggiunte funzioni che restituiscono il valore di offset che fa sparire una curva chiusa, una flat region o un suo chunk.
2024-07-09 10:25:24 +02:00
Daniele Bariletti 7a66ad27d8 EgtGeomKernel :
- correzioni alle rigate con le bezier.
2024-07-08 15:20:09 +02:00
Daniele Bariletti b4878f1ac0 EgtGeomKernel :
- correzioni e migliorie alle rigate con le bezier MINDISTPLUS.
2024-07-05 17:12:08 +02:00
Riccardo Elitropi 447ebe11e5 EgtGeomKernel :
- in calcolo pocketing, semplificate le curve di Feed e migliorata la gestione della superficie limite.
2024-07-04 16:43:44 +02:00
Dario Sassi 8981057d29 EgtGeomKernel :
- in calcolo pocketing piccole sistemazioni a salvataggio coefficiente feed (sempre in CurveTempParam).
2024-07-03 17:07:35 +02:00
Riccardo Elitropi 3270b573a8 EgtGeomKernel :
- in CalcPocketing aggiunte funzioni di Feed e migliorati i controlli sui lati aperti.
2024-07-03 13:23:52 +02:00
Daniele Bariletti 6df0cf3203 Merge branch 'master' into MoreBezier 2024-07-03 11:15:39 +02:00
Daniele Bariletti d67cca385e EgtGeomKernel :
- correzioni alle rigate con le Bezier.
2024-07-03 11:15:10 +02:00
SaraP f9d67442d6 EgtGeomKernel 2.6g1 :
- correzione offset nel caso di archi molto piccoli.
2024-07-01 10:54:37 +02:00
Dario Sassi dea96ccbcc EgtGeomKernel :
- miglioramenti a calcolo silhouette con CollisionAvoid compresa parallelizzazione
- piccole migliorie a CollisionAvoid
- migliorie e correzioni a CalcPocketing.
2024-06-29 18:45:19 +02:00
Dario Sassi 0f4be10330 EgtGeomKernel :
- in SurfTrimesh i metodi RemoveShell e RemovePart ora annullano i dati su shell e part per ricalcolarli quando richiesti.
2024-06-26 17:41:23 +02:00
Dario Sassi 121abf5864 EgtGeomKernel 2.6f4 :
- miglioramenti alla gestione di shell e part nelle superfici Trimesh.
2024-06-26 08:41:57 +02:00
Dario Sassi 38e836de2b Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2024-06-25 19:13:49 +02:00
Riccardo Elitropi 376c4e3693 EgtGeomKernel :
- In calcPocketing migliorate e semplificate le gestioni dei lati aperti, sia di bordi che di isole, anche con la superficie limite.
2024-06-25 13:29:23 +02:00
Dario Sassi 48ffd52b16 Merge commit '3e924113d3cf8134e84c53cf3f6b1d88c6ed1a7a' 2024-06-24 16:28:05 +02:00
Daniele Bariletti 9a16259ff5 EgtGeomKernel :
- correzione al miglioramento sul tempo di triangolazione delle bezier.
2024-06-20 12:52:03 +02:00
Daniele Bariletti 10ae269882 Merge branch 'master' into MoreBezier 2024-06-19 10:16:14 +02:00
Daniele Bariletti 9d845179a4 EgtGeomKernel :
- migliormaneto della velocità di calcolo per la triangolazione di superfici di Bezier.
- irrobustimento della stessa triangolazione.
2024-06-19 10:07:03 +02:00
Riccardo Elitropi 88bf84cca1 EgtGeomKernel :
- Aggiunta possibilità di entrate da isole aperte per CalcPocketing ( SpiralIN).
2024-06-18 11:15:44 +02:00
Riccardo Elitropi 5ba8f1df36 EgtGeomKernel :
- aggiunta gestione isole aperte.
2024-06-17 11:51:01 +02:00
Dario Sassi c4a05bcb2f EgtGeomKernel :
- miglioramenti al calcolo silhouette con CollisionAvoid
- modifiche a CollisionAvoid per permettere accelerazione con HashGrid anche a TestPosition.
2024-06-17 07:10:27 +02:00
Riccardo Elitropi 5841c9cae0 EgtGeomKernel :
- migliorie a CalcPocketing.
2024-06-14 16:46:56 +02:00
Dario Sassi 4fd03a78de EgtGeomKernel :
- correzione a calcolo silhouette con CAv di superficie trimesh (Level va tenuto costante nelle diverse funzioni).
2024-06-14 12:07:37 +02:00
Dario Sassi 420c072670 EgtGeomKernel :
- migliorie e sistemazioni in calcolo silhouette con CollisionAvoid.
2024-06-14 08:13:03 +02:00
SaraP 36477623b8 EgtGeomKernel :
- nel calcolo degli offset con Voronoi viene sempre eseguito l'offset sia a destra sia a sinistra ( per evitare problemi classificazione di vroni nel caso di cruve chiuse con piccole autointersezioni).
2024-06-13 09:51:43 +02:00
Dario Sassi 84d859dfe2 EgtGeomKernel :
- aggiunte funzioni per impostare e leggere TempProp e tempParam sulle curve di contorno delle Regioni.
2024-06-13 07:58:23 +02:00
Daniele Bariletti 09220bfd68 EgtGeomKernel :
- correzione all'utlima modifica alla triangolazione delle bezier.
2024-06-12 15:18:27 +02:00
Dario Sassi 42aaf6f3eb Merge commit '619905d72006d93976eff22ad76dc261e59a2790' 2024-06-12 13:29:26 +02:00
Dario Sassi 3f1f365451 EgtGeomKernel 2.6f3 :
- migliorie e irrobustimenti a calcolo silhouette di trimesh con collisio avoid.
2024-06-12 13:28:41 +02:00
Daniele Bariletti 9a29ee0e27 EgtGeomKernel :
- pulizia codice.
2024-06-12 09:19:28 +02:00
Daniele Bariletti 619905d720 EgtGeomKernel :
- correzione alla conversione di nurbs periodiche.
2024-06-11 16:05:53 +02:00
Daniele Bariletti 36ce855ef3 EgtGeomKernel :
- correzione alla conversione di nurbs periodiche.
2024-06-11 15:55:56 +02:00
Dario Sassi 9b0f2c7f59 EgtGeomKernel :
- aggiunta funzione e classe per calcolo silhouette tramite campionamento con utensile cilindrico
- in CollisionAvoid aggiunta funzione per verifica di insieme di punti (senza verifiche su intermedi).
2024-06-11 09:28:59 +02:00
Daniele Bariletti c637ccec47 EgtGeomKernel :
- aggiunta commento per triangolazione bezier.
2024-06-10 14:57:58 +02:00
Daniele Bariletti 8f27154604 EgtGeomKernel :
- correzione alla conversione di nurbs periodiche in bezier.
2024-06-10 14:57:28 +02:00
Dario Sassi 5d02732db6 EgtGeomKernel :
- correzione a Collision Avoid per utensile cilindrico che tocca vertice triangolo sul bordo
- in CalcPocketing tolti riferimenti a SafeZ e assegnato valore default a OpenMinSafe e a bAboveHead .
2024-06-07 18:59:26 +02:00
Daniele Bariletti 36657e17c4 EgtGeomKernel :
- correzione alla funzione per tagliare una sup di bezier con un piano.
2024-06-07 17:42:19 +02:00
Daniele Bariletti e2008bd479 EgtGeomKernel :
- correzione ulteriore alla triangolazione delle superfici bezier con patch con lati collassati.
2024-06-07 17:41:39 +02:00
Daniele Bariletti e32b85bc2d EgtGeomKernel :
- correzione alla triangolazione di sup. di Bezier con patch con lati collassati in un polo.
2024-06-07 16:00:24 +02:00
Dario Sassi 6dfc50e630 EgtGeomKernel 2.6f2 :
- in CAvToolSurfTm tolleranza negativa in Path vuol dire non controllare punto intermedio.
2024-06-07 13:02:07 +02:00
Riccardo Elitropi b4820ff255 EgtGeomKernel :
- piccole modifiche e migliorie a CalcPocketing.
2024-06-07 10:21:01 +02:00
Dario Sassi 515247a394 EgtGeomKernel :
- modifica a DistPointSurfTm per controllo tolleranza più efficace.
2024-06-06 17:43:26 +02:00
Dario Sassi b5c649821f Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2024-06-06 16:55:08 +02:00
Dario Sassi 9ba0c6f4cc EgtGeomKernel :
- miglioria nel calcolo silhouette di Trimesh.
2024-06-06 16:49:19 +02:00
Daniele Bariletti 35fc94d8cb Merge branch 'master' into MoreBezier 2024-06-06 09:21:18 +02:00
Daniele Bariletti a0316e280c EgtGeomKernel :
- piccola correzione.
2024-06-06 09:20:56 +02:00
Daniele Bariletti 84bcc715a8 EgtGeomKernel :
- piccola correzione di una tolleranza.
2024-06-06 09:16:53 +02:00
Daniele Bariletti b34d31029b EgtGeomKernel :
- piccola correzione.
2024-06-06 09:13:57 +02:00
Daniele Bariletti f67865f9cc EgtGeomKernel :
- piccola correzione di una tolleranza.
2024-06-06 09:12:47 +02:00
SaraP f48053a541 EgtGeomKernel :
- nelle booleane delle trimesh piccola modifica a DecomposeLoop.
2024-06-05 16:14:39 +02:00
Daniele Bariletti 8e917aa6d2 Merge branch 'master' of https://gitlab.steamware.net/egalware-cadcam/libreriebase/EgtGeomKernel 2024-06-05 09:11:18 +02:00
Daniele Bariletti f08dee836b EgtGeomKernel :
- correzioni alla conversione da nurbs a bezier per curve e superfici.
2024-06-05 09:11:00 +02:00
Daniele Bariletti 261e9ac0c8 EgtGeomKernel :
- correzioni alla conversione da nurbs a bezier per curve e superfici.
2024-06-05 09:10:22 +02:00
Dario Sassi b51d0c3e64 EgtGeomKernel :
- miglioramento a GetArc3P (ora riconosciuto come retta anche quando il punto intermedio coincide con uno dei due estremi).
2024-06-04 19:07:58 +02:00
Daniele Bariletti ac23938dd0 Merge branch 'master' into MoreBezier 2024-06-04 09:57:54 +02:00
Daniele Bariletti b9bac347e8 EgtGeomKernel :
- correzione alla gestione della conversione di curve nurbs periodiche.
2024-06-03 17:34:41 +02:00
Daniele Bariletti 980a1f62df EgtGeomKernel :
- correzione alla gestione di curve nurbs periodiche da convertire in bezier.
2024-06-03 17:32:14 +02:00
Daniele Bariletti 10c5d0fffe EgtGeomKernel :
- correzione alla rigata minDist con superficie Bezier.
2024-06-03 17:31:33 +02:00
Daniele Bariletti d7d36b670a EgtGeomKernel :
- correzione alla triangolazione di span bilineari in superfici di grado superiore all'uno.
2024-06-03 17:30:05 +02:00
Riccardo Elitropi 581551ee3e Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2024-06-03 12:06:48 +02:00
Riccardo Elitropi 487ce0c84b EgtGeomKernel :
- correzione percorsi tra più Chunk per SpiralIn/Out.
2024-06-03 12:06:44 +02:00
SaraP 5679733028 EgtGeomKernel :
- nelle operazioni booleane delle trimesh rilassata tolleranza per calcolo catene coincidenti durante la ritriangolazione.
2024-06-03 11:49:10 +02:00
Dario Sassi cd0fc4e449 EgtGeomKernel :
- piccole modifiche a Pocketing.
2024-06-03 09:10:04 +02:00
Dario Sassi e20b4b5b78 EgtGeomKernel 2.6f1 :
- modifiche a pocketing.
2024-06-03 08:15:38 +02:00
Dario Sassi b931582120 Merge commit 'bf14ab1332d4e190a3c3c8d8d802fd07b889b98b' 2024-05-31 14:48:33 +02:00
Riccardo Elitropi bf14ab1332 EgtGeomKernel :
Modifiche a CalcPocketing
- rimozione variabili statiche
- aggiunti casi ottimizzati Spiral
- estensione superfici sui lati aperti.
2024-05-31 13:10:15 +02:00
Daniele Bariletti 3b81a6b92e EgtGeomKernel :
- aggiunta la ruled bezier che aggiunge punti alla curva con meno punti ( da migliorare con la parametrizzazione sulla curva totale).
2024-05-30 16:53:37 +02:00
Dario Sassi 01bf44cf1e EgtGeomKernel :
- correzione a chiusura composita formata da un solo arco (il nuovo angolo giro al centro deve avere lo steso segno del precedente).
2024-05-30 16:45:38 +02:00
Dario Sassi b5d879cd3d EgtGeomKernel :
- in creazione regioni aggiunta chiusura loops di sicurezza dopo aggiustamenti
- in curve composite corretta chiusura per caso di un solo arco.
2024-05-30 11:20:45 +02:00
Dario Sassi 2b3c285190 EgtGeomKernel :
- modifiche stilistiche.
2024-05-30 08:45:43 +02:00
Dario Sassi 99bb83211c EgtGeomKernel 2.6e6 :
- a TestPath di CAvToolSurfTm passato un parametro in più per indicare la frazione di progress al completamento dell'operazione.
2024-05-29 18:57:12 +02:00
Daniele Bariletti b854c9588b EgtGeomKernel :
- implementata la versione ruled Bezier con la modalità isoparametrica.
2024-05-29 17:22:09 +02:00
Daniele Bariletti 2361225321 EgtGeomKernel :
- aggiunte le chiamate per la creazione di una rigata come superficie di Bezier
- aggiunta la funzione per la creazione del cono come Bezier ( ancora da implementare).
2024-05-28 16:29:10 +02:00
Daniele Bariletti eaf1138624 EgtGeomKernel :
- aggiunte le funzioni per creare rigate come superfici di Bezier
- piccole modifiche.
2024-05-28 16:25:43 +02:00
Daniele Bariletti ef5c67a4d5 EgtGeomKernel :
- aggiunti commenti
- aggiunte modifiche da implementare ulteriormente per la trinagolazione delle sup bilineari.
2024-05-28 16:23:58 +02:00
Riccardo Elitropi 3e924113d3 EgtGeomKernel :
- Aggiunte funzioni per identificazione di Parts e Shells nelle TriMesh.
2024-05-28 11:01:50 +02:00
Riccardo Elitropi dcc3fc772a EgtGeomKernel :
- modifica operazioni booleane tra Trimesh con più parti
- modifica classe DistPointSurfTm.
2024-05-27 09:26:33 +02:00
Dario Sassi a48f373e4d EgtGeomKernel :
- a SurfTriMesh aggiunta seconda funzione GetSilhouette per limitare il calcolo sopra un piano.
2024-05-27 07:51:02 +02:00
Daniele Bariletti ffd714d069 EgtGeomKernel :
- cambiato il nome ad una funzione.
2024-05-24 12:13:25 +02:00
Daniele Bariletti dc082d495e EgtGeomKernel :
- aggiunta limitazione alla creazione di una surf bezier tramite revolve nel caso in cui la curva attraversi l'asse di rivoluzione.
2024-05-24 11:30:04 +02:00
Daniele Bariletti e8e57ff793 Merge remote-tracking branch 'origin/master' into MoreBezier 2024-05-23 13:14:07 +02:00
Daniele Bariletti 3e16c4b56c EgtGeomKernel :
- aggiunti dei commenti.
2024-05-23 11:11:14 +02:00
Daniele Bariletti 77d3fcc7af EgtGeomKernel :
- aggiunta la funzione per il revolve con superfici di Bezier.
2024-05-22 12:13:15 +02:00
Daniele Bariletti 7322bf5034 EgtGeomKernel :
- correzioni alle funzioni per cambiare di grado le curve bezier.
2024-05-22 12:12:29 +02:00
Dario Sassi 2ed2a34d55 EgtGeomKernel :
- modifiche per DistPointLine con interfaccia portata in Include.
2024-05-22 08:19:10 +02:00
Daniele Bariletti d340505593 Merge branch 'master' into MoreBezier 2024-05-21 15:49:54 +02:00
Daniele Bariletti 247849d112 EgtGeomKernel :
- aggiunta la funzione per modificare un singolo peso ad una curva di Bezier.
- aggiunta la funzione per lo screwing con una superficie di Bezier.
- aggiunto un commento.
2024-05-21 15:42:57 +02:00
Dario Sassi fcbdee1dba EgtGeomKernel :
- in IntersLineSurfTm per ordinare le intersezioni si tiene conto anche della normale dei triangoli
- in ProjectCurveOnSurfTm si cerca la prima intersezione non parallela alla faccia.
2024-05-20 10:52:35 +02:00
Dario Sassi 33d1ef4123 Merge commit 'c0b5f38301f8a2749e09bdeaeb55401744096f0f' 2024-05-20 08:59:40 +02:00
SaraP fe2aba43e5 EgtGeomKernel 2.6e5 :
- sistemato il MergeTwoCurves tra due archi non piani per caso problematico di CurveArc::Set2PVN.
2024-05-17 10:31:59 +02:00
Riccardo Elitropi c0b5f38301 EgtGeomKernel :
- migliorie alle funzioni SharpRectSwept e BeveledRectSwept
- migliorie varie.
2024-05-16 13:06:55 +02:00
Dario Sassi 1c157f323e EgtGeomKernel :
- correzione in GetSurfTriMeshRectSwept suggerita da Riccardo
- aumentato step angolare del virtual milling 5assi.
2024-05-16 12:48:37 +02:00
Riccardo Elitropi 3e6aa0d81b EgtGeomKernel :
- creazione Zmap aggiungendo TriMesh.
2024-05-15 10:57:37 +02:00
Dario Sassi 34089648b0 EgtGeomKernel 2.6e4 :
- in CalcPocketing sistemata gestione di memoria che poteva dare crash.
2024-05-14 19:18:41 +02:00
Dario Sassi 0bef1638d0 EgtGeomKernel :
- corretto controllo di curva composita chiusa per caso con un solo arco.
2024-05-13 16:26:01 +02:00
Daniele Bariletti 1d4bccac4b EgtGeomKernel :
- aggiunte le funzioni per creare superfici di Bezier da Region e da Screwing.
2024-05-13 11:34:36 +02:00
Daniele Bariletti cc7aa66904 EgtGeomKernel :
- spostata la funzione CalcRegionPolyLines.
2024-05-13 10:30:24 +02:00
Daniele Bariletti 303a270359 EgtGeomKernel :
- gestione grado e razionalità delle curve convertite in Bezier.
2024-05-13 10:27:45 +02:00
Dario Sassi 17759877d4 EgtGeomKernel 2.6e3 :
- interfaccia DistLineLine ora esportata
- in lettura Curve Composite allargata tolleranza giunzione tra componenti.
2024-05-13 07:56:42 +02:00
Daniele Bariletti 5f56152a8b EgtGeomKernel :
- aggiunte le funzioni per creare SurfBez da estrusione e da FlatContour.
2024-05-09 15:13:25 +02:00
Daniele Bariletti d6567e94c4 EgtGeomKernel :
- aggiunta funzione MakeRational per curve di Bezier
- aggiunta funzione per la conversione in Bezier di una ICurve.
2024-05-08 17:49:31 +02:00
Dario Sassi d00064a671 Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2024-05-08 15:08:52 +02:00
SaraP dc91f932f7 EgtGeomKernel :
- correzione nell'associazione dei punti a minima distanza delle polylines.
2024-05-08 11:15:51 +02:00
Daniele Bariletti a3f05c41fe Merge branch 'master' into MoreBezier 2024-05-08 08:52:20 +02:00
Dario Sassi d911862c84 Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2024-05-07 19:46:02 +02:00
Dario Sassi 1b025ec60e EgtGeomKernel :
- in GeneralizedCut di SurfTriMesh migliorata gestione delle facce.
2024-05-07 19:45:50 +02:00
Daniele Bariletti 9d18e1a9ba EgtGeomKernel :
- mantenuta l'approssimazione della spirale con bezier cubiche razionali.
2024-05-07 17:34:42 +02:00
Daniele Bariletti 3143c00729 EgtGeomKernel :
- aggiunte le funzioni ProjectCurveOnSurfBez e la sua versione estesa.
2024-05-07 14:50:23 +02:00
Dario Sassi 3a8900983a Merge commit '35c019a03e4662fbf0a9a402df7082d526ff42ec' 2024-05-07 11:25:34 +02:00
Dario Sassi 971a76e473 EgtGeomKernel :
- in CAvToolSurfTm corretto segno parametro spostamento della posizione
- migliorata RemoveAlignedPoints di PolyLine con controllo punto iniziale di percorsi chiusi
- modificate GetSurfTriMeshSharpRectSwept e GetSurfTriMeshBeveledRectSwept per generare superfici chiuse.
2024-05-07 11:23:49 +02:00
Daniele Bariletti 621bf93ee9 Merge branch 'master' into MoreBezier 2024-05-07 10:32:08 +02:00
Daniele Bariletti 35c019a03e EgtGeomKernel :
- cambio versione.
2024-05-07 10:17:11 +02:00
Daniele Bariletti de97f249a2 Merge branch 'MoreBezier' 2024-05-07 10:06:47 +02:00
Daniele Bariletti 81f0cc23bf EgtGeomKernel :
- aggiunte le funzioni per la conversione da curva generica a curva di Bezier.
2024-05-07 10:03:03 +02:00
Dario Sassi 8a0234093e EgtGeomKernel :
- nella ricostruzione dei contorni delle superfici TriMesh (Loops) inseriti controlli per terminare cicli andati in loop
- nella funzione di taglio delle superfici TriMesh con un piano aumentata del 10% la tolleranza (1.1 * EPS_SMALL).
2024-05-03 12:00:55 +02:00
Dario Sassi 88d355f2f7 EgtGeomKernel :
- in SurfTriMesh SetTFlag e GetTFlag messe in interfaccia (inoltre corretta la prima funzione).
2024-05-02 09:29:01 +02:00
Dario Sassi 20fd06d67c EgtGeomKernel 2.6e1 :
- ricompilazione per modifiche a gestione chiave di rete.
2024-04-30 16:53:39 +02:00
Daniele Bariletti 52f2785e67 Merge branch 'master' into MoreBezier 2024-04-30 15:34:30 +02:00
Dario Sassi 2e2bd0ceec Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2024-04-30 08:54:52 +02:00
Daniele Bariletti e4c3c9a2a4 EgtGeomKernel :
- aumentato il grado possibile per curve/superfici di Bezier.
2024-04-30 08:53:09 +02:00
Daniele Bariletti e490c173e8 EgtGeomKernel :
- svincolata la funzione GetSingleEdge della SurfBezier dalla creazione della trimesh.
2024-04-29 17:46:30 +02:00
Daniele Bariletti 7e165a6dea EgtGeomKernel :
- eliminati dei memory leaks.
2024-04-29 17:40:17 +02:00
Daniele Bariletti 49ff6e79a8 EgtGeomKernel :
- correzione nella gestione della conversione delle curve/superfici NURBS.
2024-04-29 17:20:30 +02:00
Dario Sassi 1160e3d067 Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2024-04-26 11:24:44 +02:00
Dario Sassi 91d667bcfc EgtGeomKernel :
- modifiche a Zmap per virtual-additive
- modifiche a Frame3d per Set con i tre assi che ora aggiusta errori molto piccoli.
2024-04-26 11:23:56 +02:00
Daniele Bariletti b23df89cd3 EgtGeomKernel :
- tolto header di debug.
2024-04-24 10:48:58 +02:00
Daniele Bariletti cf9737a48e Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2024-04-24 10:47:54 +02:00
Daniele Bariletti ae52115bda EgtGeomKernel :
- aggiunto il contro OFFSET alla SetTrimRegion delle Bezier
- aggiunte funzioni varie al tree delle Bezier.
2024-04-24 10:47:50 +02:00
Dario Sassi 3dd9466938 Merge commit 'c0f7eb6727287b012402c0c52c5b50195257df83' 2024-04-24 09:32:35 +02:00
Riccardo Elitropi c0f7eb6727 EgtGeomKernel :
- piccola correzione booleane TriMesh.
2024-04-24 09:26:51 +02:00
Dario Sassi 76e2843ed3 Merge commit 'faa2004c298ad6a2d3e35c61fbf893cdf7beb779' 2024-04-22 19:06:50 +02:00
Riccardo Elitropi faa2004c29 EgtGeomKernel :
- integrate modifiche vMill additivo dal ramo TempForVmill.
2024-04-22 13:21:37 +02:00
Dario Sassi c9a59dc5ea Merge branch 'master' of https://gitlab.steamware.net/egaltech/EgtGeomKernel 2024-04-22 10:50:40 +02:00
Dario Sassi aaaf951990 EgtGeomKernel :
- aggiunti alcuni controlli sulla validità dei parametri in Collision Avoid.
2024-04-22 10:49:34 +02:00
Daniele Bariletti cc263089ca EgtGeomKernel :
- aggiunta gestione ulteriore delle curve nurbs periodiche da formato .stp.
2024-04-22 09:15:49 +02:00
Daniele Bariletti d99b8f4c86 EgtGeomKernel :
- correzione alla conversione di curve NURBS.
- modifica del parametro per il metodo IsPlanar di SurfBezier.
2024-04-18 11:04:34 +02:00
Daniele Bariletti f5e5441469 EgtGeomKernel :
- aggiunto il metodo IsPlanar per la SurfBezier.
2024-04-17 16:00:30 +02:00
Daniele Bariletti 4206a4822f EgtGeomKernel :
- funzione CalcPoles chiamata direttamente all'inizio della funzione Cut.
2024-04-17 15:16:23 +02:00
Daniele Bariletti 788a5bc4eb EgtGeomKernel :
- correzioni nella gestione dei trim delle superfici di Bezier.
- correzioni varie alle superfici di Bezier.
2024-04-17 14:52:07 +02:00
Riccardo Elitropi a5a96c2bb5 EgtGeomKernel :
- piccola modifica tolleranza SurfFlatRegion.
2024-04-17 12:04:23 +02:00
Riccardo Elitropi 881691e678 Merge commit '80f4d64ad4008ade24e403eeb8831609f3623459' 2024-04-17 12:02:56 +02:00
Dario Sassi 80f4d64ad4 EgtGeomKernel :
- piccola miglioria alla conversione dell'orientazione dei riferimenti in quaternioni.
2024-04-17 06:51:05 +02:00
SaraP 7d9a641e39 EgtGeomKernel :
- in GetSurfTriMeshSwept nel calcolo del piano della curva guida nel caso di una linea viene considerata l'estrusione ( come viene fatto nel calcolo degli offset).
2024-04-16 08:46:59 +02:00
Dario Sassi d82ccd8947 EgtGeomKernel 2.6d4 :
- aggiunta della classe Quaternion.
2024-04-14 18:17:41 +02:00
Dario Sassi 318b1e4b2f EgtGeomKernel :
- separata da GetAuxSurf la funzione GetApproxSurf
- piccola miglioria ad AdjustLoop.
2024-04-13 17:09:17 +02:00
Riccardo Elitropi 583e30170a EgtGeomKernel :
- ricalcolo delle facce dopo scalatura per TriMesh
- Rimozione punti allineati nei contatti tra facce diverse.
2024-04-12 15:27:52 +02:00
SaraP fe46b8ebd2 EgtGeomKernel 2.6d3 :
- in Voronoi modificata la direzione dei bisettori per averli sempre orientati dal parametro minore al maggiore.
2024-04-12 14:53:00 +02:00
Daniele Bariletti 6a845e4f81 EgtGeomKernel :
- migliorato un controllo per la SurfTmByBezier.
2024-04-12 11:52:05 +02:00
Daniele Bariletti 46e18b3977 EgtGeomKernel :
- aggiunti parametri per ottenere la trimesh di una Bezier con precisione scelta.
2024-04-11 17:38:00 +02:00
Dario Sassi 20d146268b EgtGeomKernel :
- MakeUniform e OnWhichEdge da metodi di SurfBezier a funzioni globali di SurfAux.
2024-04-11 00:17:20 +02:00
Daniele Bariletti 5013fc2b6c EgtGeomKernel :
- funzioni MakeUniform e OnWhichEdge per Bezier spostate da converter e exch3dm a metodi della classe Bezier.
2024-04-10 16:17:39 +02:00
Daniele Bariletti 32a0e1d2b5 EgtGeomKernel :
- gestiti i loop di trim di sup di Bezier che escono dal parametrico.
- corretto un errore di triangolazione per sup di Bezier.
2024-04-10 09:21:49 +02:00
Daniele Bariletti 7ce9e7e26c EgtGeomKernel :
- resa pubblica la funzione per il SubType di ExtDim.
2024-04-10 09:17:19 +02:00
Daniele Bariletti 9a6e972521 EgtGeomKernel :
- gestita la forma periodica per curve NURBS da file .stp.
- gestione di regioni di trim di cui non si riesce a fare l'intersezione col parametrico.
2024-04-10 09:16:11 +02:00
Dario Sassi 8c008f36c2 EgtGeomKernel 2.6d2 :
- proiezione curva su superficie estesa a casi con guida un punto o una superficie
- ricompilazione per modifiche a EgtLock.
2024-04-09 14:47:25 +02:00
Dario Sassi eae29d4854 EgtGeomKernel :
- aggiunta funzione ProjectCurveOnSurfTm con parametro entità guida.
2024-04-08 09:43:17 +02:00
Dario Sassi 2bd53476ca EgtGeomKernel :
- modifiche per RotationMinimizingFrame e RotationXplaneFrame
- aggiornato calcolo superfici TriMesh da Swept di curva o di regione.
2024-04-05 16:55:20 +02:00
Dario Sassi 015065f3c8 Merge remote-tracking branch 'origin/RMF' 2024-04-04 14:50:44 +02:00
Dario Sassi 12862a6c76 EgtGeomKernel 2.6d1 :
- correzione nella triangolazione (da RiccardoE).
2024-04-04 12:13:48 +02:00
Daniele Bariletti 9d869411e8 EgtGeomKernel :
- eliminato memory leak nella classe Surf Bezier.
2024-04-03 10:10:36 +02:00
Dario Sassi 0c3c17e0f4 EgtGeomKernel :
- correzione a ProjectCurveOnSurfTm per assegnazione parametro punto proiettato su curva originale.
2024-04-03 08:11:35 +02:00
Dario Sassi 47f6eedd9c EgtGeomKernel :
- piccole modifiche stilistiche.
2024-03-27 17:27:01 +01:00
Daniele Bariletti b36adefd10 EgtGeomKernel :
- tolto header per il debug.
2024-03-27 11:10:03 +01:00
Daniele Bariletti 8cf8c0def5 Merge branch 'CmdCreateSurfBezier' 2024-03-27 11:08:29 +01:00
Daniele Bariletti 1e6a70c60d EgtGeomKernel :
- gestione della convenzione C3D per le curve NURBS periodiche.
2024-03-27 10:59:40 +01:00
SaraP 9712e8c526 EgtGeomKernel 2.6c3 :
- aggiornamento versione.
2024-03-27 10:04:08 +01:00
SaraP 6b1f932dfc EgtGeomKernel :
- modifiche al calcolo fillet per gestire curve con offset complessi.
2024-03-27 09:57:22 +01:00
Daniele Bariletti 7882964b26 EgtGeomKernel :
- corretto bug nella richiesta degli edge3D di una Bezier.
2024-03-25 09:59:21 +01:00
Dario Sassi 9653ba8d53 EgtGeomKernel :
- aggiunte funzioni di Test tra solido e superficie speculari di quelle di Collision Detection degli stessi solidi con colido.
2024-03-25 09:03:13 +01:00
Daniele Bariletti ba66891539 EgtGeomKernel :
- corretto caso non gestito nelle dimensioni angolari.
2024-03-22 17:59:40 +01:00
Daniele Bariletti 4ab4a2fc81 EgtGeomKernel :
- correzioni ad Edges3D della Bezier. #11
2024-03-22 16:11:51 +01:00
Daniele Bariletti a6d9811595 Merge remote-tracking branch 'origin/master' into CmdCreateSurfBezier 2024-03-21 15:02:59 +01:00
Daniele Bariletti c94a62f5b2 EgtGeomKernel
- cambiato il nome della funzione per richiedere gli edge di una Bezier.
2024-03-21 15:00:37 +01:00
Daniele Bariletti 535011072d EgtGeomKernel :
- corretta e ultimata la funzione edges3D per Bezier. #11
2024-03-21 12:57:59 +01:00
Daniele Bariletti 718f5ce716 EgtGeomKernel :
- ottimizzata la funzione per restituire gli edge 3D di una Bezier.
MANCA:
- debug
- debug su closedV
- debug closedU + ClosedV.
2024-03-20 17:55:24 +01:00
Daniele Bariletti 3f02119ef7 EgtGeomKernel :
- corretta la funzione che restituisce gli edge 3D di una Bezier.
2024-03-20 11:56:50 +01:00
Daniele Bariletti 632b711b2a EgtGeomKernel :
- edge 3D di una Bezier tramite calcolo delle autointersezioni in 3D.
2024-03-20 09:40:16 +01:00
Riccardo Elitropi 07faeaaa11 EgtGeomKernel :
- correzione booleane Trimesh.
2024-03-19 11:59:18 +01:00
SaraP d253312139 EgtGeomKernel :
- gestione traslazione, rotazione e cambi di frame per Voronoi
- aggiunta funzione per resettare Voronoi degli oggetti.
2024-03-15 16:03:51 +01:00
Dario Sassi 5952eee22c EgtGeomKernel :
- modifiche e correzioni varie a dimensioni angolari, diametrali e radiali.
2024-03-14 20:00:44 +01:00
Daniele Bariletti 4483434711 EgtGeomKernel :
- migliorata gestione degli edge3D delle sup di Bezier. #11
2024-03-14 18:02:16 +01:00
Daniele Bariletti 93678ce56c EgtGeomKernel :
- migliorata la gestione dell'aggiornamento degli edge3D delle superfici Bezier.
2024-03-14 10:03:34 +01:00
Daniele Bariletti 8c4b0bde37 EgtGeomKernel :
- corretto un bug nell'aggiornamento della grafica dopo il trim di sup di Bezier. #11
2024-03-13 16:36:12 +01:00
Daniele Bariletti 67c03daa42 EgtGeomKernel :
- nella get Edges3D per sup di Bezier gestito il caso di sup trimmate.
2024-03-13 15:59:55 +01:00
Daniele Bariletti 469d1c3445 EgtGeomKernel :
- aggiunta della funzione per richiedere gli edge 3D o come linea spezzata o come curva Bezier. #11
2024-03-12 09:35:09 +01:00
Dario Sassi 7d3284fef3 EgtGeomKernel 2.6c2 :
- modifiche a SurfTriMesh per flag visualizzazione spigoli vivi in shading
- modifiche a VolZmap per flag visualizzazione spigoli vivi in shading
- aggiunte funzioni PreSave, PostSave e PostLoad per consentire di convertire nuovi parametri delle entità in info prima del salvataggio e riprenderli alla lettura.
2024-03-10 10:20:44 +01:00
Daniele Bariletti 3857cd4b5a Merge branch 'master' into CmdCreateSurfBezier 2024-03-08 16:38:34 +01:00
Daniele Bariletti a04a748552 EgtGeomKernel :
- pulizia del codice
- aggiunta commenti.
2024-03-08 16:29:10 +01:00
Daniele Bariletti 13ecae3829 EgtGeomKernel :
- correzione del raffinamento dei punti di intersezione tra un piano e una sup di bezier.
2024-03-08 16:16:02 +01:00
Daniele Bariletti 1acd97d42a EgtGeomKernel :
- correzioni all'aggiunta di taglia aperti (nel parametrico) ad una superficie di bezier già trimmata.
2024-03-08 09:55:53 +01:00
Daniele Bariletti 6a92f6b80f EgtGeomKernel :
- pulizia del codice.
2024-03-06 14:52:57 +01:00
Daniele Bariletti bf3760808e EgtGeomKernel :
- correzione di errori nella gestione del taglio sul polo e sul bordo di chiusura di una sup. di Bezier.
2024-03-05 17:17:12 +01:00
Daniele Bariletti 45226d0b6f EgtGeomKernel :
- correzione errori nel cut delle sup. di Bezier
- miglioramento del raffinamento dell'unproject per sup. di Bezier.
2024-03-04 14:51:23 +01:00
Daniele Bariletti 96ea6bc73e EgtGeomKernel :
- correzioni al cut di una superficie Bezier.
2024-03-01 11:37:12 +01:00
Daniele Bariletti 7a2af0b5f2 EgtGeomKernel :
- spostato il filtro delle intersezioni Line-SupBez da executor a GeomKernel.
2024-02-28 10:30:49 +01:00
Daniele Bariletti 8d2ae598e5 Merge remote-tracking branch 'origin/master' into CmdCreateSurfBezier 2024-02-28 09:29:32 +01:00
Daniele Bariletti 4b19936136 Merge branch 'master' into CmdCreateSurfBezier 2024-02-27 17:18:55 +01:00
Daniele Bariletti 6efb3a6e7f EgtGeomKernel :
- corretta funzione di trim di sup. di Bezier con piani, in zone di punti di polo.
2024-02-27 16:34:28 +01:00
Daniele Bariletti 3a623996d2 EgtGeomKernel :
- corretta la funzione per il trim di sup. di Bezier con piani, in zone di salto per periodicità e in caso di tagli multipli.
2024-02-26 09:48:02 +01:00
Daniele Bariletti 4bada73c83 EgtGeomKernel :
- inizio modifica al calcolo di tagli multipli ad una superficie di Bezier.
2024-02-23 10:19:04 +01:00
Daniele Bariletti 156d0eea4b EgtGeomKernel :
- corretta e migliorata la fuzione di cut per superfici di Bezier.
Manca :
- da migliorare i tagli multipli alle superfici di Bezier.
2024-02-22 17:39:44 +01:00
Daniele Bariletti c303b1273d EgtGeomKernel :
- aggiunta la funzione per creare una sfera come superficie bezier
- aggiunta la funzione per tagliare una superificie bezier con un piano.
2024-02-20 12:28:45 +01:00
Daniele Bariletti 8d0c04e092 Merge branch 'Dist-Inters_Bezier' into CmdCreateSurfBezier 2024-02-14 14:43:50 +01:00
Daniele Bariletti 5d62db3e73 EgtGeomKernel :
- aggiunta funzione per creare una sfera come sup Bezier.
2024-02-14 14:40:57 +01:00
Daniele Bariletti 1005aae0e9 Merge branch 'master' into Dist-Inters_Bezier 2024-02-12 12:54:14 +01:00
Daniele Bariletti 0f8012ce61 EgtGeomKernel :
- implementata l'intersezione tra linea e sup bezier.
2024-02-12 12:52:56 +01:00
Daniele Bariletti 2c159d7ce6 EgtGeomKernel :
- aggiunta funzione di raffinamento dei punti di intersezione per Bezier.
2024-02-08 12:02:12 +01:00
Daniele Bariletti b4058ad363 EgtGeomKernel :
- aggiunta delle intersezioni tra linee e SupBez.
2024-02-08 09:28:49 +01:00
Daniele Bariletti 6b5de066b7 Merge branch 'master' into Dist-Inters_Bezier 2024-02-06 16:03:42 +01:00
Daniele Bariletti a3531c4841 EgtGeomKernel :
- correzione su coordinate U e V ai vertici delle TriMesh.
2023-09-19 10:07:51 +02:00
Daniele Bariletti d7ec1fd304 EgtGeomKernel :
- aggiunta delle coordinate U e V ai vertici delle TriMesh.
Manca da modificare :
- funzione MoveVertex
- surfBezier.cpp quando verrà aggiunto il ramo Trim&Mesh.
2023-09-18 10:55:43 +02:00
143 changed files with 33297 additions and 7412 deletions
+2
View File
@@ -317,6 +317,8 @@ AdjustLoops( ICurve* pCurve, ICURVEPLIST& CrvLst, bool bNeedSameProp)
pCrvCo->RemoveSmallDefects( 2 * LIN_TOL_MIN, ANG_TOL_STD_DEG, true) ;
// unisco eventuali tratti allineati
pCrvCo->MergeCurves( LIN_TOL_MIN, ANG_TOL_STD_DEG, true, bNeedSameProp) ;
// richiudo i loop per sicurezza
pCrvCo->Close() ;
}
}
+1 -1
View File
@@ -16,9 +16,9 @@
#include "CurveBezier.h"
#include "CurveComposite.h"
#include "CreateCurveAux.h"
#include "DistPointLine.h"
#include "GeoConst.h"
#include "/EgtDev/Include/EGkArcPntDirTgCurve.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGkDistPointCurve.h"
#include "/EgtDev/Include/EGkArcSpecial.h"
#include "/EgtDev/Include/EgtPointerOwner.h"
+2 -1
View File
@@ -134,7 +134,8 @@ GetArc3P( const Point3d& ptStart, const Point3d& ptOther, const Point3d& ptEnd,
// calcolo arco non riuscito, se i punti sono allineati nel giusto verso per essere una retta
// verifico se i punti sono allineati nel giusto verso
if ( ( ptOther - ptStart) * ( ptEnd - ptOther) > EPS_ZERO) {
if ( ( ptOther - ptStart) * ( ptEnd - ptOther) > EPS_ZERO ||
AreSamePointApprox( ptOther, ptStart) || AreSamePointApprox( ptEnd, ptOther)) {
// creo l'oggetto retta
PtrOwner<CurveLine> pLine( CreateBasicCurveLine()) ;
if ( IsNull( pLine))
+8 -8
View File
@@ -133,22 +133,22 @@ Attribs::Load( NgeReader& ngeIn)
unsigned char ucLev ;
if ( ! ngeIn.ReadUchar( ucLev, ","))
return false ;
m_Data[LEVEL] = CLIP( ucLev, GDB_LV_USER, GDB_LV_TEMP) ;
m_Data[LEVEL] = Clamp( ucLev, GDB_LV_USER, GDB_LV_TEMP) ;
// modo
unsigned char ucMode ;
if ( ! ngeIn.ReadUchar( ucMode, ","))
return false ;
m_Data[MODE] = CLIP( ucMode, GDB_MD_STD, GDB_MD_HIDDEN) ;
m_Data[MODE] = Clamp( ucMode, GDB_MD_STD, GDB_MD_HIDDEN) ;
// stato (se SEL è convertito in ON)
unsigned char ucStat ;
if ( ! ngeIn.ReadUchar( ucStat, ","))
return false ;
m_Data[STATUS] = CLIP( ucStat, GDB_ST_OFF, GDB_ST_ON) ;
m_Data[STATUS] = Clamp( ucStat, GDB_ST_OFF, GDB_ST_ON) ;
// marcatura (sempre OFF)
unsigned char ucMark ;
if ( ! ngeIn.ReadUchar( ucMark, ";"))
return false ;
m_Data[MARK] = CLIP( ucMark, GDB_MK_OFF, GDB_MK_OFF) ;
m_Data[MARK] = Clamp( ucMark, GDB_MK_OFF, GDB_MK_OFF) ;
// materiale
if ( ! ngeIn.ReadInt( m_Material, ";"))
return false ;
@@ -185,22 +185,22 @@ Attribs::DataFromString( const string& sParam)
int nLev ;
if ( ! FromString( vsParams[0], nLev))
return false ;
m_Data[LEVEL] = CLIP( nLev, GDB_LV_USER, GDB_LV_TEMP) ;
m_Data[LEVEL] = Clamp( nLev, GDB_LV_USER, GDB_LV_TEMP) ;
// modo
int nMode ;
if ( ! FromString( vsParams[1], nMode))
return false ;
m_Data[MODE] = CLIP( nMode, GDB_MD_STD, GDB_MD_HIDDEN) ;
m_Data[MODE] = Clamp( nMode, GDB_MD_STD, GDB_MD_HIDDEN) ;
// stato (ammessi solo OFF e ON)
int nStat ;
if ( ! FromString( vsParams[2], nStat))
return false ;
m_Data[STATUS] = CLIP( nStat, GDB_ST_OFF, GDB_ST_ON) ;
m_Data[STATUS] = Clamp( nStat, GDB_ST_OFF, GDB_ST_ON) ;
// marcatura (ammesso solo OFF)
int nMark ;
if ( ! FromString( vsParams[3], nMark))
return false ;
m_Data[MARK] = CLIP( nMark, GDB_MK_OFF, GDB_MK_OFF) ;
m_Data[MARK] = Clamp( nMark, GDB_MK_OFF, GDB_MK_OFF) ;
return true ;
}
+6 -8
View File
@@ -16,14 +16,12 @@
#include "/EgtDev/Include/EGkGdbConst.h"
#include "/EgtDev/Include/EGkColor.h"
#include "/EgtDev/Include/EgtStringBase.h"
#include "/EgtDev/Include/EgtNumUtils.h"
class NgeWriter ;
class NgeReader ;
class GeomDB ;
//----------------------------------------------------------------------------
#define CLIP( nV, nMIN, nMAX) (( nV < nMIN) ? nMIN : (( nV > nMAX) ? nMAX : nV))
//----------------------------------------------------------------------------
class Attribs
{
@@ -46,14 +44,14 @@ class Attribs
bool Load( NgeReader& ngeIn) ;
void SetLevel( int nLev)
{ m_OldData[LEVEL] = m_Data[LEVEL] ;
m_Data[LEVEL] = CLIP( nLev, GDB_LV_USER, GDB_LV_TEMP) ; }
m_Data[LEVEL] = Clamp( nLev, GDB_LV_USER, GDB_LV_TEMP) ; }
void RevertLevel( void)
{ std::swap( m_Data[LEVEL], m_OldData[LEVEL]) ; }
int GetLevel( void) const
{ return m_Data[LEVEL] ; }
void SetMode( int nMode)
{ m_OldData[MODE] = m_Data[MODE] ;
m_Data[MODE] = CLIP( nMode, GDB_MD_STD, GDB_MD_HIDDEN) ; }
m_Data[MODE] = Clamp( nMode, GDB_MD_STD, GDB_MD_HIDDEN) ; }
void RevertMode( void)
{ std::swap( m_Data[MODE], m_OldData[MODE]) ; }
int GetMode( void) const
@@ -61,13 +59,13 @@ class Attribs
void SetStatus( int nStat)
{ if ( m_Data[STATUS] != GDB_ST_SEL)
m_OldData[STATUS] = m_Data[STATUS] ;
m_Data[STATUS] = CLIP( nStat, GDB_ST_OFF, GDB_ST_SEL) ; }
m_Data[STATUS] = Clamp( nStat, GDB_ST_OFF, GDB_ST_SEL) ; }
void RevertStatus( void)
{ SetStatus( m_OldData[STATUS]) ; }
int GetStatus( void) const
{ return m_Data[STATUS] ; }
void SetMark( void)
{ m_Data[MARK] = GDB_MK_ON ; }
void SetMark( int nMark)
{ m_Data[MARK] = Clamp( nMark, GDB_MK_OFF, GDB_MK_ON_2) ; }
void ResetMark( void)
{ m_Data[MARK] = GDB_MK_OFF ; }
int GetMark( void) const
+9 -6
View File
@@ -83,7 +83,7 @@ GetBiArc( const Point3d& ptP0, double dDir0Deg, const Point3d& ptP1, double dDir
//----------------------------------------------------------------------------
ICurve*
GetBiArc( const Point3d& ptP0, double dDir0Deg, const Point3d& ptP1, double dDir1Deg,
const PolyLine& PL, double& dDist)
const PolyLine& PL, double& dDist, double dTol)
{
// calcolo la curva dove giacciono i punti di giunzione tra i due archi del biarco
PtrOwner<ICurve> pJCrv( CalcJCurve( ptP0, dDir0Deg, ptP1, dDir1Deg)) ;
@@ -122,7 +122,7 @@ GetBiArc( const Point3d& ptP0, double dDir0Deg, const Point3d& ptP1, double dDir
}
}
}
// non c'è intersezione, assegno valore medio
// non c'è intersezione, assegno valore medio
if ( dU < -0.5)
dU = 0.5 ;
// elimino casi vicino agli estremi, danno solo problemi
@@ -142,7 +142,10 @@ GetBiArc( const Point3d& ptP0, double dDir0Deg, const Point3d& ptP1, double dDir
Point3d ptPrev = ptCurr ;
while ( bPnt) {
double dLen = Dist( ptCurr, ptPrev) ;
int nStep = ( dLen < STEP ? 2 : 1) * int( dLen / STEP) + 1 ;
int nStep = int( dLen / STEP) + 1 ;
int nMinStep = ( dLen > 50 * dTol ? 3 : ( dLen > 10 * dTol ? 2 : 1)) ;
int nMaxStep = 10 ;
nStep = Clamp( nStep, nMinStep, nMaxStep) ;
for ( int i = 1 ; i <= nStep ; ++ i) {
double dCoeff = double( i) / nStep ;
Point3d ptP = Media( ptPrev, ptCurr, dCoeff) ;
@@ -163,7 +166,7 @@ GetBiArc( const Point3d& ptP0, double dDir0Deg, const Point3d& ptP1, double dDir
static ICurve*
CalcJCurve( const Point3d& ptP0, double dDir0Deg, const Point3d& ptP1, double dDir1Deg)
{
// se i due punti coincidono, non si può fare alcunché
// se i due punti coincidono, non si può fare alcunché
if ( AreSamePointApprox( ptP0, ptP1))
return nullptr ;
@@ -205,14 +208,14 @@ CalcJCurve( const Point3d& ptP0, double dDir0Deg, const Point3d& ptP1, double dD
double dDir0RelDeg = DiffAngle( dDir0Deg, dDirDiffDeg) ;
// direzione iniziale secondo arco limite rispetto a direzione P0->P1 (dalla finale simmetrico e invert)
double dDir1RelDeg = - DiffAngle( dDir1Deg, dDirDiffDeg) ;
// nel caso di direzioni a 180deg si sceglie la più compatta
// nel caso di direzioni a 180deg si sceglie la più compatta
if ( abs( abs( dDir1RelDeg) - ANG_STRAIGHT) < EPS_SMALL)
dDir1RelDeg = ( dDir0RelDeg > 0 ? ANG_STRAIGHT : - ANG_STRAIGHT) ;
else if ( abs( abs( dDir0RelDeg) - ANG_STRAIGHT) < EPS_SMALL)
dDir0RelDeg = ( dDir1RelDeg > 0 ? ANG_STRAIGHT : - ANG_STRAIGHT) ;
// intervallo angolare ammissibile a partire da direzione iniziale primo arco ammissibile ( == Dir0)
double dDeltaAngDeg = - dDir0RelDeg + dDir1RelDeg ;
// se non è nella regione, prendo l'altra parte di arco
// se non è nella regione, prendo l'altra parte di arco
if ( ! AngleInSpan( dDirStartRelDeg, dDir0RelDeg, dDeltaAngDeg))
pArc->ToExplementary() ;
// inverto per avere parametrizzazione crescente allontanandosi da Dir0 e avvicinandosi a Dir1
+1 -1
View File
@@ -17,5 +17,5 @@
//-----------------------------------------------------------------------------
ICurve* GetBiArc( const Point3d& ptP0, double dDir0Deg, const Point3d& ptP1, double dDir1Deg,
const PolyLine& PL, double& dDist) ;
const PolyLine& PL, double& dDist, double dTol) ;
File diff suppressed because it is too large Load Diff
+57
View File
@@ -0,0 +1,57 @@
//----------------------------------------------------------------------------
// EgalTech 2024-2024
//----------------------------------------------------------------------------
// File : CAvSilhouetteSurfTm.h Data : 16.06.24 Versione : 2.6f2
// Contenuto : Dichiarazione della classe calcolo multi-silhouette.
//
//
//
// Modifiche : 10.06.24 DS Creazione modulo.
//
//
//----------------------------------------------------------------------------
#pragma once
#include "CAvToolSurfTm.h"
#include "SurfFlatRegion.h"
#include "/EgtDev/Include/EGkCAvSilhouetteSurfTm.h"
//-----------------------------------------------------------------------------
class CAvParSilhouettesSurfTm : public ICAvParSilhouettesSurfTm
{
public :
// generica
bool SetData( const CISURFTMPVECTOR& vpStm, const Frame3d& frPlanes, double dTol) override ;
bool SetData( const CISURFTMPVECTOR& vpStm, const Frame3d& frPlanes, double dTol,
double dSideAng, double dDiam, double dCornRad, double dMaxMat, double dOffsR,
double dMaxDepth) override ;
bool GetSilhouette( double dLevel, POLYLINEVECTOR& vPL) override ;
public :
CAvParSilhouettesSurfTm( void) ;
private :
bool Prepare( void) ;
private :
CISURFTMPVECTOR m_vpStm ;
CAvToolSurfTm m_cavTstm ;
Frame3d m_frGrid ;
double m_dTol ;
double m_dSharpedTol ;
int m_nStepX ;
int m_nStepY ;
double m_dRad ;
double m_dCornRad ;
double m_dMaxMat ;
double m_dSideAng ;
double m_dOffsR ;
double m_dDimZ ;
double m_dLevelOffs ;
double m_dMaxDepth ;
bool m_bGridOk ;
bool m_bTool ;
DBLVECTOR m_vdGrid ;
} ;
+526 -55
View File
@@ -1,21 +1,21 @@
//----------------------------------------------------------------------------
// EgalTech 2018-2018
// EgalTech 2018-2024
//----------------------------------------------------------------------------
// File : CAvToolSurfTm.cpp Data : 08.05.18 Versione : 1.9e2
// File : CAvToolSurfTm.cpp Data : 07.06.24 Versione : 2.6f2
// Contenuto : Implementazione della classe CAvToolSurfTm.
//
//
//
// Modifiche : 27.04.18 DS Creazione modulo.
//
// 07.06.24 DS Con tolleranza lineare negativa non si controlla il punto medio.
//
//----------------------------------------------------------------------------
#include "stdafx.h"
#include "CAvToolTriangle.h"
#include "CAvToolSurfTm.h"
#include "DistPointLine.h"
#include "DllMain.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGnStringUtils.h"
#include <thread>
#include <future>
@@ -24,6 +24,7 @@ using namespace std ;
//----------------------------------------------------------------------------
const int STEP_PE = 50 ;
const double MAX_MOVE = 20000 ;
//----------------------------------------------------------------------------
ICAvToolSurfTm*
@@ -37,10 +38,29 @@ CreateCAvToolSurfTm( void)
// CAvToolSurfTm
//----------------------------------------------------------------------------
CAvToolSurfTm::CAvToolSurfTm( void)
: m_Tool( false)
: m_frMove( false), m_Tool( false)
{
}
//----------------------------------------------------------------------------
bool
CAvToolSurfTm::Clear( void)
{
// pulisco la lista dei puntatori a Stm
m_vSTM.clear() ;
// pulisco e inizializzo la prima posizione della lista delle basi per gli indici dei triangoli
m_vBaseInd.clear() ;
m_vBaseInd.emplace_back( 0) ;
// pulisco HashGrid 2d
m_HGrids.Clear() ;
// reset utensile
m_Tool.Clear() ;
// reset riferimento
m_frMove.Reset( false) ;
return true ;
}
//----------------------------------------------------------------------------
bool
CAvToolSurfTm::SetSurfTm( const ISurfTriMesh& Stm)
@@ -50,6 +70,9 @@ CAvToolSurfTm::SetSurfTm( const ISurfTriMesh& Stm)
// pulisco e inizializzo la prima posizione della lista delle basi per gli indici dei triangoli
m_vBaseInd.clear() ;
m_vBaseInd.emplace_back( 0) ;
// pulisco HashGrid 2d
m_HGrids.Clear() ;
// non tocco l'utensile
// aggiungo la superficie
return AddSurfTm( Stm) ;
}
@@ -58,7 +81,7 @@ CAvToolSurfTm::SetSurfTm( const ISurfTriMesh& Stm)
bool
CAvToolSurfTm::AddSurfTm( const ISurfTriMesh& Stm)
{
// verifico validità superficie
// verifico validità superficie
const SurfTriMesh* pStm = GetBasicSurfTriMesh( &Stm) ;
if ( pStm == nullptr || ! pStm->IsValid())
return false ;
@@ -99,40 +122,227 @@ CAvToolSurfTm::SetGenTool( const ICurveComposite* pToolOutline)
//----------------------------------------------------------------------------
bool
CAvToolSurfTm::TestPosition( const Point3d& ptT, const Vector3d& vtDir, const Vector3d& vtMove, double& dTotDist)
CAvToolSurfTm::TestPosition( const Point3d& ptT, const Vector3d& vtDir, const Vector3d& vtMove,
double& dTotDist, Vector3d* pvtTriaN) const
{
// Se utensile non definito, errore
if ( m_Tool.GetType() == Tool::UNDEF)
return false ;
// Imposto il riferimento di movimento
if ( ! AreSameOrOppositeVectorApprox( vtDir, vtMove))
m_frMove.Set( ORIG, vtMove, vtDir) ;
else
m_frMove.Set( ORIG, vtMove) ;
// Eseguo controllo
// Se direzioni non definite, errore
if ( vtDir.IsSmall() || vtMove.IsSmall())
return false ;
// Se riferimento di movimento già presente
if ( m_frMove.IsValid()) {
// Calcolo nuovo riferimento di movimento
Frame3d frMove ;
if ( ! AreSameOrOppositeVectorApprox( vtDir, vtMove))
frMove.Set( ORIG, vtMove, vtDir) ;
else
frMove.Set( ORIG, vtMove) ;
// Se riferimenti di movimento uguali, sfrutto HashGrid 2d
if ( AreSameFrame( frMove, m_frMove)) {
// Eseguo controllo
Point3d ptCurr = ptT ;
Vector3d vtTriaN ;
dTotDist = MyTestPositionHG( ptCurr, vtDir, vtTriaN) ;
if ( pvtTriaN != nullptr)
*pvtTriaN = vtTriaN ;
return ( dTotDist > - EPS_SMALL) ;
}
}
// Altrimenti eseguo controllo diretto
Point3d ptCurr = ptT ;
dTotDist = MyTestPosition( ptCurr, vtDir) ;
Vector3d vtTriaN ;
dTotDist = MyTestPosition( ptCurr, vtDir, vtMove, vtTriaN) ;
if ( pvtTriaN != nullptr)
*pvtTriaN = vtTriaN ;
return ( dTotDist > - EPS_SMALL) ;
}
//----------------------------------------------------------------------------
bool
CAvToolSurfTm::TestPath( PNTULIST& lPntM, const Vector3d& vtDir, const Vector3d& vtMove, double dLinTol)
CAvToolSurfTm::TestPositionAdv( const Point3d& ptT, const Vector3d& vtDir, const Vector3d& vtMove,
double& dTotDist, VCT3DVECTOR& vVtN) const
{
// Funzione per calcolo collisione tra utensile e superfici ;
// dToTDist è la distanza di traslazione del punto ptT lungo vtDir per evitare la collisione,
// vVtN è la normale del triangolo che genera collsione ( NB. Nel caso di più triangoli concorrenti,
// vengono restituite tutte le normali trovate)
// Inizializzazione parametri
dTotDist = 0 ;
vVtN.clear() ;
// Se utensile non definito, errore
if ( m_Tool.GetType() == Tool::UNDEF)
return false ;
// Se direzioni non definite, errore
if ( vtDir.IsSmall() || vtMove.IsSmall())
return false ;
// Se riferimento di movimento già presente
if ( m_frMove.IsValid()) {
// Calcolo nuovo riferimento di movimento
Frame3d frMove ;
if ( ! AreSameOrOppositeVectorApprox( vtDir, vtMove))
frMove.Set( ORIG, vtMove, vtDir) ;
else
frMove.Set( ORIG, vtMove) ;
// Se riferimenti di movimento uguali, sfrutto HashGrid 2d
if ( AreSameFrame( frMove, m_frMove)) {
// Eseguo controllo
Point3d ptCurr = ptT ;
dTotDist = MyTestPositionHGAdv( ptCurr, vtDir, vVtN) ;
return ( dTotDist > - EPS_SMALL) ;
}
}
// Altrimenti eseguo controllo diretto
Point3d ptCurr = ptT ;
dTotDist = MyTestPositionAdv( ptCurr, vtDir, vtMove, vVtN) ;
return ( dTotDist > - EPS_SMALL) ;
}
//----------------------------------------------------------------------------
bool
CAvToolSurfTm::TestSeries( PNTUVECTOR& vPntM, const Vector3d& vtDir, const Vector3d& vtMove, double dProgCoeff)
{
// Se utensile non definito, errore
if ( m_Tool.GetType() == Tool::UNDEF)
return false ;
// Se lista vuota, non devo fare alcunché
// Se direzioni non definite, errore
if ( vtDir.IsSmall() || vtMove.IsSmall())
return false ;
// Se vettore vuoto, non devo fare alcunché
if ( vPntM.empty())
return true ;
// Calcolo nuovo riferimento di movimento
Frame3d frMove ;
if ( ! AreSameOrOppositeVectorApprox( vtDir, vtMove))
frMove.Set( ORIG, vtMove, vtDir) ;
else
frMove.Set( ORIG, vtMove) ;
// Se riferimento di movimento non presente o diverso dal calcolato
if ( ! m_frMove.IsValid() || ! AreSameFrame( frMove, m_frMove)) {
// Salvo nuovo riferimento
m_frMove = frMove ;
// Ricalcolo HashGrid
if ( ! PrepareHashGrid())
return false ;
}
// Determino il numero di punti dell'insieme
m_nTotPnt = int( vPntM.size()) ;
// Recupero il numero massimo di thread concorrenti
int nThreadMax = thread::hardware_concurrency() ;
bool bOk = true ;
// Se un solo thread o pochi punti
if ( nThreadMax <= 1 || m_nTotPnt < 500) {
m_nCurrPnt = 0 ;
bOk = TestSubSeries( -1, vPntM, vtDir, 0, m_nTotPnt - 1, dProgCoeff) ;
ProcessEvents( int( 100 * dProgCoeff), 0) ;
}
// altrimenti
else {
const int MAX_PARTS = 32 ;
INTINTVECTOR vFstLst( MAX_PARTS) ;
// calcolo le parti del vettore
int nPartCnt = min( nThreadMax, MAX_PARTS) ;
int nPartDim = m_nTotPnt / nPartCnt + 1 ;
for ( int i = 0 ; i < nPartCnt ; ++ i) {
vFstLst[i].first = i * nPartDim ;
vFstLst[i].second = min( ( i + 1) * nPartDim, m_nTotPnt) - 1 ;
}
// processo le parti
m_nCurrPnt = 0 ;
m_bBreak = false ;
future<bool> vRes[MAX_PARTS] ;
for ( int i = 0 ; i < nPartCnt ; ++ i)
vRes[i] = async( launch::async, &CAvToolSurfTm::TestSubSeries, this, i, ref( vPntM), cref( vtDir), vFstLst[i].first, vFstLst[i].second, dProgCoeff) ;
// attendo i risultati
int nFin = 0 ;
int nNextPE = 0 ;
while ( nFin < nPartCnt) {
for ( int i = 0 ; i < nPartCnt ; ++ i) {
if ( vRes[i].valid() && vRes[i].wait_for( chrono::nanoseconds{ 1}) == future_status::ready) {
bOk = vRes[i].get() && bOk ;
++ nFin ;
}
}
if ( m_nCurrPnt > nNextPE) {
int nRes = ProcessEvents( int( m_nCurrPnt * 100. / m_nTotPnt * dProgCoeff), 10) ;
nNextPE += STEP_PE ;
if ( nRes == 1)
m_bBreak = true ;
}
}
ProcessEvents( int( 100 * dProgCoeff), 0) ;
}
return bOk ;
}
//----------------------------------------------------------------------------
bool
CAvToolSurfTm::TestSubSeries( int nId, PNTUVECTOR& vPntM, const Vector3d& vtDir, int nFirst, int nLast, double dProgCoeff)
{
// Se vettore vuoto, non devo fare alcunché
if ( vPntM.empty())
return true ;
// Ciclo sui punti da verificare
for ( int i = nFirst ; i <= nLast ; ++ i) {
// verifico il punto
Vector3d vtTriaN ;
double dMove = MyTestPositionHG( vPntM[i].first, vtDir, vtTriaN) ;
vPntM[i].second = dMove ;
if ( dMove < - EPS_SMALL)
return false ;
++ m_nCurrPnt ;
// se singolo thread
if ( nId == -1) {
// gestione eventi (ogni STEP_PE punti)
if (( m_nCurrPnt % STEP_PE) == 0) {
int nRes = ProcessEvents( int( m_nCurrPnt * 100. / m_nTotPnt * dProgCoeff), 0) ;
if ( nRes == 1)
return false ;
}
}
// altrimenti multithread
else {
if ( m_bBreak)
return false ;
}
}
return true ;
}
//----------------------------------------------------------------------------
bool
CAvToolSurfTm::TestPath( PNTULIST& lPntM, const Vector3d& vtDir, const Vector3d& vtMove, double dLinTol, double dProgCoeff)
{
// Se utensile non definito, errore
if ( m_Tool.GetType() == Tool::UNDEF)
return false ;
// Se direzioni non definite, errore
if ( vtDir.IsSmall() || vtMove.IsSmall())
return false ;
// Se lista vuota, non devo fare alcunché
if ( lPntM.empty())
return true ;
// Imposto il riferimento di movimento
if ( ! AreSameOrOppositeVectorApprox( vtDir, vtMove))
m_frMove.Set( ORIG, vtMove, vtDir) ;
// Controllo la tolleranza lineare (se negativa non vanno fatti controlli sui punti medi)
if ( dLinTol > -EPS_ZERO)
dLinTol = max( dLinTol, EPS_SMALL) ;
else
m_frMove.Set( ORIG, vtMove) ;
// Predispongo Hash Grid
if ( ! PrepareHashGrid())
return false ;
dLinTol = -1 ;
// Calcolo nuovo riferimento di movimento
Frame3d frMove ;
if ( ! AreSameOrOppositeVectorApprox( vtDir, vtMove))
frMove.Set( ORIG, vtMove, vtDir) ;
else
frMove.Set( ORIG, vtMove) ;
// Se riferimento di movimento non presente o diverso dal calcolato
if ( ! m_frMove.IsValid() || ! AreSameFrame( frMove, m_frMove)) {
// Salvo nuovo riferimento
m_frMove = frMove ;
// Ricalcolo HashGrid
if ( ! PrepareHashGrid())
return false ;
}
// Determino il numero di punti del path
m_nTotPnt = int( lPntM.size()) ;
// Recupero il numero massimo di thread concorrenti
@@ -140,8 +350,9 @@ CAvToolSurfTm::TestPath( PNTULIST& lPntM, const Vector3d& vtDir, const Vector3d&
bool bOk = true ;
// Se un solo thread o pochi punti
if ( nThreadMax <= 1 || m_nTotPnt < 500) {
bOk = TestSubPath( -1, lPntM, vtDir, dLinTol) ;
ProcessEvents( 100, 0) ;
m_nCurrPnt = 0 ;
bOk = TestSubPath( -1, lPntM, vtDir, dLinTol, dProgCoeff) ;
ProcessEvents( int( 100 * dProgCoeff), 0) ;
}
// altrimenti
else {
@@ -161,7 +372,7 @@ CAvToolSurfTm::TestPath( PNTULIST& lPntM, const Vector3d& vtDir, const Vector3d&
m_bBreak = false ;
future<bool> vRes[MAX_PARTS] ;
for ( int i = 0 ; i < nPartCnt ; ++ i)
vRes[i] = async( launch::async, &CAvToolSurfTm::TestSubPath, this, i, ref( vlPntM[i]), cref( vtDir), dLinTol) ;
vRes[i] = async( launch::async, &CAvToolSurfTm::TestSubPath, this, i, ref( vlPntM[i]), cref( vtDir), dLinTol, dProgCoeff) ;
// attendo i risultati
int nFin = 0 ;
int nNextPE = 0 ;
@@ -173,7 +384,7 @@ CAvToolSurfTm::TestPath( PNTULIST& lPntM, const Vector3d& vtDir, const Vector3d&
}
}
if ( m_nCurrPnt > nNextPE) {
int nRes = ProcessEvents( int( m_nCurrPnt * 100. / m_nTotPnt), 10) ;
int nRes = ProcessEvents( int( m_nCurrPnt * 100. / m_nTotPnt * dProgCoeff), 10) ;
nNextPE += STEP_PE ;
if ( nRes == 1)
m_bBreak = true ;
@@ -185,18 +396,98 @@ CAvToolSurfTm::TestPath( PNTULIST& lPntM, const Vector3d& vtDir, const Vector3d&
lPntM.pop_back() ;
lPntM.splice( lPntM.end(), vlPntM[i]) ;
}
ProcessEvents( 100, 0) ;
ProcessEvents( int( 100 * dProgCoeff), 0) ;
}
// pulisco HashGrid 2d
m_HGrids.Clear() ;
return bOk ;
}
//----------------------------------------------------------------------------
bool
CAvToolSurfTm::TestSubPath( int nId, PNTULIST& lPntM, const Vector3d& vtDir, double dLinTol)
CAvToolSurfTm::TestSeriesAdv( PNTUVVECTVECTOR& vPntM, const Vector3d& vtDir, const Vector3d& vtMove, double dProgCoeff)
{
// Se lista vuota, non devo fare alcunché
// NB. la posizione del punto non viene modificata :
// get<0> vPntM[i] è il punto su cui viene posizionata la testa dell'utensile ( const)
// get<1> vPntM[i] è il parametro di traslazione del punto lungo vtDir per evitare collisioni con i triangoli
// get<2> vPntM[i] è un vettore di Vector3d contenente tutte le normali di tangenza ( a meno di 10 * EPS_SMALL)
// Se utensile non definito, errore
if ( m_Tool.GetType() == Tool::UNDEF)
return false ;
// Se direzioni non definite, errore
if ( vtDir.IsSmall() || vtMove.IsSmall())
return false ;
// Se vettore vuoto, non devo fare alcunché
if ( vPntM.empty())
return true ;
// Calcolo nuovo riferimento di movimento
Frame3d frMove ;
if ( ! AreSameOrOppositeVectorApprox( vtDir, vtMove))
frMove.Set( ORIG, vtMove, vtDir) ;
else
frMove.Set( ORIG, vtMove) ;
// Se riferimento di movimento non presente o diverso dal calcolato
if ( ! m_frMove.IsValid() || ! AreSameFrame( frMove, m_frMove)) {
// Salvo nuovo riferimento
m_frMove = frMove ;
// Ricalcolo HashGrid
if ( ! PrepareHashGrid())
return false ;
}
// Determino il numero di punti del path
m_nTotPnt = int( vPntM.size()) ;
// Recupero il numero massimo di thread concorrenti
int nThreadMax = thread::hardware_concurrency() ;
bool bOk = true ;
// Se un solo thread o pochi punti
if ( nThreadMax <= 1 || m_nTotPnt < 500) {
m_nCurrPnt = 0 ;
bOk = TestSubSeriesAdv( -1, vPntM, vtDir, 0, m_nTotPnt - 1, dProgCoeff) ;
ProcessEvents( int( 100 * dProgCoeff), 0) ;
}
// altrimenti
else {
const int MAX_PARTS = 32 ;
INTINTVECTOR vFstLst( MAX_PARTS) ;
// calcolo le parti del vettore
int nPartCnt = min( nThreadMax, MAX_PARTS) ;
int nPartDim = m_nTotPnt / nPartCnt + 1 ;
for ( int i = 0 ; i < nPartCnt ; ++ i) {
vFstLst[i].first = i * nPartDim ;
vFstLst[i].second = min( ( i + 1) * nPartDim, m_nTotPnt) - 1 ;
}
// processo le parti
m_nCurrPnt = 0 ;
m_bBreak = false ;
future<bool> vRes[MAX_PARTS] ;
for ( int i = 0 ; i < nPartCnt ; ++ i)
vRes[i] = async( launch::async, &CAvToolSurfTm::TestSubSeriesAdv, this, i, ref( vPntM), cref( vtDir), vFstLst[i].first, vFstLst[i].second, dProgCoeff) ;
// attendo i risultati
int nFin = 0 ;
int nNextPE = 0 ;
while ( nFin < nPartCnt) {
for ( int i = 0 ; i < nPartCnt ; ++ i) {
if ( vRes[i].valid() && vRes[i].wait_for( chrono::nanoseconds{ 1}) == future_status::ready) {
bOk = vRes[i].get() && bOk ;
++ nFin ;
}
}
if ( m_nCurrPnt > nNextPE) {
int nRes = ProcessEvents( int( m_nCurrPnt * 100. / m_nTotPnt * dProgCoeff), 10) ;
nNextPE += STEP_PE ;
if ( nRes == 1)
m_bBreak = true ;
}
}
ProcessEvents( int( 100 * dProgCoeff), 0) ;
}
return bOk ;
}
//----------------------------------------------------------------------------
bool
CAvToolSurfTm::TestSubPath( int nId, PNTULIST& lPntM, const Vector3d& vtDir, double dLinTol, double dProgCoeff)
{
// Se lista vuota, non devo fare alcunché
if ( lPntM.empty())
return true ;
// Ciclo sui punti
@@ -206,11 +497,13 @@ CAvToolSurfTm::TestSubPath( int nId, PNTULIST& lPntM, const Vector3d& vtDir, dou
while ( itPntMCurr != lPntM.end()) {
// verifico il punto
ptCurr = itPntMCurr->first ;
itPntMCurr->second = MyTestPositionHG( itPntMCurr->first, vtDir) ;
if ( itPntMCurr->second < - EPS_SMALL)
Vector3d vtTriaN ;
double dMove = MyTestPositionHG( itPntMCurr->first, vtDir, vtTriaN) ;
itPntMCurr->second = dMove ;
if ( dMove < - EPS_SMALL)
return false ;
// se esiste il punto precedente devo verificare il medio
if ( itPntMPrev != lPntM.end()) {
// se esiste il punto precedente e richiesto devo verificare il medio
if ( itPntMPrev != lPntM.end() && dLinTol > 0) {
MyTestMidPointHG( lPntM, itPntMPrev, itPntMCurr, ptPrev, ptCurr, vtDir, dLinTol, 1) ;
}
// passo al successivo
@@ -222,7 +515,7 @@ CAvToolSurfTm::TestSubPath( int nId, PNTULIST& lPntM, const Vector3d& vtDir, dou
if ( nId == -1) {
// gestione eventi (ogni STEP_PE punti)
if (( m_nCurrPnt % STEP_PE) == 0) {
int nRes = ProcessEvents( int( m_nCurrPnt * 100. / m_nTotPnt), 0) ;
int nRes = ProcessEvents( int( m_nCurrPnt * 100. / m_nTotPnt * dProgCoeff), 0) ;
if ( nRes == 1)
return false ;
}
@@ -236,10 +529,44 @@ CAvToolSurfTm::TestSubPath( int nId, PNTULIST& lPntM, const Vector3d& vtDir, dou
return true ;
}
//----------------------------------------------------------------------------
bool
CAvToolSurfTm::TestSubSeriesAdv( int nId, PNTUVVECTVECTOR& vPntM, const Vector3d& vtDir, int nFirst, int nLast, double dProgCoeff)
{
// Se vettore vuoto, non devo fare alcunché
if ( vPntM.empty())
return true ;
// Ciclo sui punti da verificare
for ( int i = nFirst ; i <= nLast ; ++ i) {
// verifico il punto
Point3d ptCurr = get<0>( vPntM[i]) ;
get<1>( vPntM[i]) = MyTestPositionHGAdv( ptCurr, vtDir, get<2>( vPntM[i])) ;
if ( get<1>( vPntM[i]) < - EPS_SMALL)
return false ;
++ m_nCurrPnt ;
// se singolo thread
if ( nId == -1) {
// gestione eventi (ogni STEP_PE punti)
if (( m_nCurrPnt % STEP_PE) == 0) {
int nRes = ProcessEvents( int( m_nCurrPnt * 100. / m_nTotPnt * dProgCoeff), 0) ;
if ( nRes == 1)
return false ;
}
}
// altrimenti multithread
else {
if ( m_bBreak)
return false ;
}
}
return true ;
}
//----------------------------------------------------------------------------
bool
CAvToolSurfTm::MyTestMidPointHG( PNTULIST& lPntM, const PNTULIST::iterator& itPntMPrev, const PNTULIST::iterator& itPntMCurr,
const Point3d& ptPrev, const Point3d& ptCurr, const Vector3d& vtDir, double dLinTol, int nLev)
const Point3d& ptPrev, const Point3d& ptCurr, const Vector3d& vtDir, double dLinTol, int nLev) const
{
// se superato limite di ricursione, esco
const int MAX_LEV = 10 ;
@@ -249,7 +576,8 @@ CAvToolSurfTm::MyTestMidPointHG( PNTULIST& lPntM, const PNTULIST::iterator& itPn
Point3d ptMid = Media( ptPrev, ptCurr, 0.5) ;
// ne effettuo la correzione per evitare la collisione
Point3d ptNewMid = ptMid ;
double dMidMove = MyTestPositionHG( ptNewMid, vtDir) ;
Vector3d vtTriaN ;
double dMidMove = MyTestPositionHG( ptNewMid, vtDir, vtTriaN) ;
if ( dMidMove < - EPS_SMALL)
return false ;
// massima distanza ammissibile
@@ -258,7 +586,7 @@ CAvToolSurfTm::MyTestMidPointHG( PNTULIST& lPntM, const PNTULIST::iterator& itPn
if ( abs(( Media( itPntMPrev->first, itPntMCurr->first, 0.5) - ptNewMid) * m_frMove.VersZ()) > 0.5 * dLinTol ||
SqDist( itPntMPrev->first, itPntMCurr->first) > dMaxSqDist) {
// aggiungo
lPntM.emplace( itPntMCurr, ptNewMid, - dMidMove) ;
lPntM.emplace( itPntMCurr, ptNewMid, dMidMove) ;
auto itPntMMid = itPntMCurr ;
-- itPntMMid ;
// verifico intervallo precedente
@@ -271,20 +599,48 @@ CAvToolSurfTm::MyTestMidPointHG( PNTULIST& lPntM, const PNTULIST::iterator& itPn
//----------------------------------------------------------------------------
double
CAvToolSurfTm::MyTestPosition( Point3d& ptT, const Vector3d& vtDir)
CAvToolSurfTm::MyTestPosition( Point3d& ptT, const Vector3d& vtDir, const Vector3d& vtMove, Vector3d& vtTriaN) const
{
// box dell'utensile con suo movimento
BBox3d b3Tool ;
// utensile
b3Tool.Add( ptT) ;
b3Tool.Add( ptT - vtDir * m_Tool.GetHeigth()) ;
if ( vtDir.IsX())
b3Tool.Expand( 0, m_Tool.GetRadius(), m_Tool.GetRadius()) ;
else if ( vtDir.IsY())
b3Tool.Expand( m_Tool.GetRadius(), 0, m_Tool.GetRadius()) ;
else if ( vtDir.IsZ())
b3Tool.Expand( m_Tool.GetRadius(), m_Tool.GetRadius(), 0) ;
else {
double dExpandX = m_Tool.GetRadius() * sqrt( 1 - vtDir.x * vtDir.x) ;
double dExpandY = m_Tool.GetRadius() * sqrt( 1 - vtDir.y * vtDir.y) ;
double dExpandZ = m_Tool.GetRadius() * sqrt( 1 - vtDir.z * vtDir.z) ;
b3Tool.Expand( dExpandX, dExpandY, dExpandZ) ;
}
// aggiungo movimento
BBox3d b3Moved = b3Tool ;
b3Moved.Translate( MAX_MOVE * vtMove) ;
b3Tool.Add( b3Moved) ;
// determino movimento minimo per evitare collisione con superfici
double dTotDist = 0 ;
vtTriaN = V_NULL ;
for ( auto pStm : m_vSTM) {
Triangle3d Tria ;
for ( int nTria = pStm->GetFirstTriangle( Tria) ;
nTria != SVT_NULL ;
nTria = pStm->GetNextTriangle( nTria, Tria)) {
double dDist = CAvToolTriangle( m_Tool, ptT, vtDir, Tria, m_frMove.VersZ()) ;
if ( dDist < - EPS_SMALL)
return -1 ;
if ( dDist > EPS_SMALL) {
dTotDist += dDist ;
ptT += dDist * m_frMove.VersZ() ;
INTVECTOR vTria ;
if ( pStm->GetAllTriaOverlapBox( b3Tool, vTria)) {
for ( int nTria : vTria) {
Triangle3d Tria ;
if ( pStm->GetTriangle( nTria, Tria)) {
double dDist = CAvToolTriangle( m_Tool, ptT, vtDir, Tria, vtMove) ;
if ( dDist < - EPS_SMALL)
return -1 ;
if ( dDist > EPS_SMALL) {
dTotDist += dDist ;
ptT += dDist * vtMove ;
vtTriaN = Tria.GetN() ;
}
}
}
}
}
@@ -293,7 +649,61 @@ CAvToolSurfTm::MyTestPosition( Point3d& ptT, const Vector3d& vtDir)
//----------------------------------------------------------------------------
double
CAvToolSurfTm::MyTestPositionHG( Point3d& ptT, const Vector3d& vtDir)
CAvToolSurfTm::MyTestPositionAdv( Point3d& ptT, const Vector3d& vtDir, const Vector3d& vtMove, VCT3DVECTOR& vVtTriaN) const
{
// box dell'utensile con suo movimento
BBox3d b3Tool ;
// utensile
b3Tool.Add( ptT) ;
b3Tool.Add( ptT - vtDir * m_Tool.GetHeigth()) ;
if ( vtDir.IsX())
b3Tool.Expand( 0, m_Tool.GetRadius(), m_Tool.GetRadius()) ;
else if ( vtDir.IsY())
b3Tool.Expand( m_Tool.GetRadius(), 0, m_Tool.GetRadius()) ;
else if ( vtDir.IsZ())
b3Tool.Expand( m_Tool.GetRadius(), m_Tool.GetRadius(), 0) ;
else {
double dExpandX = m_Tool.GetRadius() * sqrt( 1 - vtDir.x * vtDir.x) ;
double dExpandY = m_Tool.GetRadius() * sqrt( 1 - vtDir.y * vtDir.y) ;
double dExpandZ = m_Tool.GetRadius() * sqrt( 1 - vtDir.z * vtDir.z) ;
b3Tool.Expand( dExpandX, dExpandY, dExpandZ) ;
}
// aggiungo movimento
BBox3d b3Moved = b3Tool ;
b3Moved.Translate( MAX_MOVE * vtMove) ;
b3Tool.Add( b3Moved) ;
// determino movimento minimo per evitare collisione con superfici
double dTotDist = 0 ;
vVtTriaN.clear() ;
for ( auto pStm : m_vSTM) {
INTVECTOR vTria ;
if ( pStm->GetAllTriaOverlapBox( b3Tool, vTria)) {
for ( int nTria : vTria) {
Triangle3d Tria ;
if ( pStm->GetTriangle( nTria, Tria)) {
double dDist = CAvToolTriangle( m_Tool, ptT, vtDir, Tria, vtMove) ;
if ( dDist < - EPS_SMALL)
return -1 ;
// se devo traslare il punto, c'è collisione
if ( dDist > EPS_SMALL) {
if ( dDist > 10 * EPS_SMALL) {
vVtTriaN.clear() ;
dTotDist += dDist ;
ptT += ( dDist - 5 * EPS_SMALL) * m_frMove.VersZ() ;
}
vVtTriaN.push_back( Tria.GetN()) ;
}
}
}
}
}
return dTotDist ;
}
//----------------------------------------------------------------------------
double
CAvToolSurfTm::MyTestPositionHG( Point3d& ptT, const Vector3d& vtDir, Vector3d& vtTriaN) const
{
// calcolo box utensile nel riferimento di movimento
BBox3d b3Tool ;
@@ -313,8 +723,10 @@ CAvToolSurfTm::MyTestPositionHG( Point3d& ptT, const Vector3d& vtDir)
double dExpandZ = m_Tool.GetRadius() * sqrt( 1 - vtDirL.z * vtDirL.z) ;
b3Tool.Expand( dExpandX, dExpandY, dExpandZ) ;
}
// ciclo sui triangoli che intersecano box in 2d
// ciclo sui triangoli che intersecano box in 2d
double dTotDist = 0 ;
vtTriaN = V_NULL ;
INTVECTOR vnIds ;
if ( m_HGrids.Find( b3Tool, vnIds)) {
for ( int i = 0 ; i < int( vnIds.size()) ; ++ i) {
@@ -330,11 +742,70 @@ CAvToolSurfTm::MyTestPositionHG( Point3d& ptT, const Vector3d& vtDir)
if ( dDist > EPS_SMALL) {
dTotDist += dDist ;
ptT += dDist * m_frMove.VersZ() ;
vtTriaN = Tria.GetN() ;
}
else if ( dDist < -EPS_SMALL)
return -1 ;
}
}
return dTotDist ;
}
//----------------------------------------------------------------------------
double
CAvToolSurfTm::MyTestPositionHGAdv( Point3d& ptT, const Vector3d& vtDir, VCT3DVECTOR& vVtTriaN) const
{
// calcolo box utensile nel riferimento di movimento
BBox3d b3Tool ;
Point3d ptTL = ptT ; ptTL.ToLoc( m_frMove) ;
Vector3d vtDirL = vtDir ; vtDirL.ToLoc( m_frMove) ;
b3Tool.Add( ptTL) ;
b3Tool.Add( ptTL - vtDirL * m_Tool.GetHeigth()) ;
if ( vtDirL.IsX())
b3Tool.Expand( 0, m_Tool.GetRadius(), m_Tool.GetRadius()) ;
else if ( vtDirL.IsY())
b3Tool.Expand( m_Tool.GetRadius(), 0, m_Tool.GetRadius()) ;
else if ( vtDirL.IsZ())
b3Tool.Expand( m_Tool.GetRadius(), m_Tool.GetRadius(), 0) ;
else {
double dExpandX = m_Tool.GetRadius() * sqrt( 1 - vtDirL.x * vtDirL.x) ;
double dExpandY = m_Tool.GetRadius() * sqrt( 1 - vtDirL.y * vtDirL.y) ;
double dExpandZ = m_Tool.GetRadius() * sqrt( 1 - vtDirL.z * vtDirL.z) ;
b3Tool.Expand( dExpandX, dExpandY, dExpandZ) ;
}
// ciclo sui triangoli che intersecano box in 2d
double dTotDist = 0. ;
INTVECTOR vnIds ;
if ( m_HGrids.Find( b3Tool, vnIds)) {
for ( int i = 0 ; i < int( vnIds.size()) ; ++ i) {
// recupero la superficie
int nInd = vnIds[i] ;
int nSurf = GetSurfInd( nInd) ;
if ( nSurf == -1)
return -1 ;
// recupero il triangolo
int nT = nInd - m_vBaseInd[nSurf] ;
Triangle3d Tria ;
if ( ! m_vSTM[nSurf]->GetTriangle( nT, Tria))
return -1 ;
// calcolo della collisione
double dDist = CAvToolTriangle( m_Tool, ptT, vtDir, Tria, m_frMove.VersZ()) ;
if ( dDist < - EPS_SMALL)
return -1 ;
// se devo traslare il punto, c'è collisione
if ( dDist > EPS_SMALL) {
if ( dDist > 10 * EPS_SMALL) {
vVtTriaN.clear() ;
dTotDist += dDist ;
ptT += ( dDist - 5 * EPS_SMALL) * m_frMove.VersZ() ;
}
vVtTriaN.push_back( Tria.GetN()) ;
}
}
}
return dTotDist ;
}
@@ -345,7 +816,7 @@ CAvToolSurfTm::PrepareHashGrid( void)
// pulisco HashGrid 2d
m_HGrids.Clear() ;
// verifico esistenza superfici
if ( m_vSTM.size() == 0 || m_vBaseInd.size() < m_vSTM.size() + 1)
if ( m_vSTM.empty() || m_vBaseInd.size() < m_vSTM.size() + 1)
return false ;
// creo HashGrid 2d
const int LIM_HG_TRIA = 256 ;
@@ -372,7 +843,7 @@ CAvToolSurfTm::PrepareHashGrid( void)
//----------------------------------------------------------------------------
int
CAvToolSurfTm::GetSurfInd( int nT)
CAvToolSurfTm::GetSurfInd( int nT) const
{
// verifico la presenza di almeno un intervallo
if ( m_vBaseInd.size() < 2)
+32 -7
View File
@@ -34,22 +34,47 @@ class CAvToolSurfTm : public ICAvToolSurfTm
{ return m_Tool.GetRadius() ; }
double GetToolHeight( void) const override
{ return m_Tool.GetHeigth() ; }
double GetToolTipHeight( void) const override
{ return m_Tool.GetTipHeigth() ; } ;
double GetToolTipRadius( void) const override
{ return m_Tool.GetTipRadius() ; } ;
double GetToolCornRadius( void) const override
{ return m_Tool.GetCornRadius() ; } ;
CISURFTMPVECTOR GetvStm( void) const {
CISURFTMPVECTOR vcStm ;
for ( int i = 0 ; i < int( m_vSTM.size()) ; ++ i)
vcStm.emplace_back( CloneSurfTriMesh( m_vSTM[i])) ;
return vcStm ;
}
const ICurveComposite& GetToolOutline( bool bApprox = false) const override
{ return ( bApprox ? m_Tool.GetApproxOutline() : m_Tool.GetOutline()) ;}
bool TestPosition( const Point3d& ptT, const Vector3d& vtDir, const Vector3d& vtMove, double& dTotDist) override ;
bool TestPath( PNTULIST& lPntM, const Vector3d& vtDir, const Vector3d& vtMove, double dLinTol) override ;
bool TestPosition( const Point3d& ptT, const Vector3d& vtDir, const Vector3d& vtMove,
double& dTotDist, Vector3d* pvtTriaN = nullptr) const override ;
bool TestPositionAdv( const Point3d& ptT, const Vector3d& vtDir, const Vector3d& vtMove,
double& dTotDist, VCT3DVECTOR& vVtN) const override ;
bool TestSeries( PNTUVECTOR& vPntM, const Vector3d& vtDir, const Vector3d& vtMove, double dProgCoeff = 1) override ;
bool TestSeriesAdv( PNTUVVECTVECTOR& vPntM, const Vector3d& vtDir, const Vector3d& vtMove, double dProgCoeff = 1) override ;
bool TestPath( PNTULIST& lPntM, const Vector3d& vtDir, const Vector3d& vtMove, double dLinTol, double dProgCoeff = 1) override ;
public :
CAvToolSurfTm( void) ;
bool Clear( void) ;
private :
bool TestSubPath( int nId, PNTULIST& lPntM, const Vector3d& vtDir, double dLinTol) ;
double MyTestPosition( Point3d& ptT, const Vector3d& vtDir) ;
double MyTestPositionHG( Point3d& ptT, const Vector3d& vtDir) ;
bool TestSubSeries( int nId, PNTUVECTOR& vPntM, const Vector3d& vtDir, int nFirst, int nLast, double dProgCoeff) ;
bool TestSubSeriesAdv( int nId, PNTUVVECTVECTOR& vPntM, const Vector3d& vtDir, int nFirst, int nLast, double dProgCoeff) ;
bool TestSubPath( int nId, PNTULIST& lPntM, const Vector3d& vtDir, double dLinTol, double dProgCoeff) ;
double MyTestPosition( Point3d& ptT, const Vector3d& vtDir, const Vector3d& vtMove, Vector3d& vtTriaN) const ;
double MyTestPositionAdv( Point3d& ptT, const Vector3d& vtDir, const Vector3d& vtMove, VCT3DVECTOR& vVtTriaN) const ;
double MyTestPositionHG( Point3d& ptT, const Vector3d& vtDir, Vector3d& vtTriaN) const ;
double MyTestPositionHGAdv( Point3d& ptT, const Vector3d& vtDir, VCT3DVECTOR& vVtTriaN) const ;
bool MyTestMidPointHG( PNTULIST& lPntM, const PNTULIST::iterator& itPntMPrev, const PNTULIST::iterator& itPntMCurr,
const Point3d& ptPrev, const Point3d& ptCurr, const Vector3d& vtDir, double dLinTol, int nLev) ;
const Point3d& ptPrev, const Point3d& ptCurr, const Vector3d& vtDir, double dLinTol, int nLev) const ;
bool PrepareHashGrid( void) ;
int GetSurfInd( int nT) ;
int GetSurfInd( int nT) const ;
private :
typedef std::vector<const SurfTriMesh*> CSURFTMPVECTOR ; // vettore di puntatori a const SurfTriMesh
+2 -2
View File
@@ -17,8 +17,8 @@
#include "CAvToolTriangle.h"
#include "IntersLineSurfStd.h"
#include "IntersLineTria.h"
#include "DistPointLine.h"
#include "CDeUtility.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGkIntervals.h"
#include "/EgtDev/Include/ENkPolynomialRoots.h"
#include "/EgtDev/Include/EgtNumUtils.h"
@@ -2503,7 +2503,7 @@ DiskSegmentEscapeDistLongMot( const Point3d& ptDiskCen, double dDiskRad,
double dSegDist = 0. ;
for ( int nSol = 0 ; nSol < nRoot ; ++ nSol) {
// Soluzione interna al segmento
if ( vdRoots[nSol] > 0. && vdRoots[nSol] < dSegLen) {
if ( vdRoots[nSol] > 0. && vdRoots[nSol] < dSegLen + EPS_ZERO) {
Point3d ptC = ptSeg + vdRoots[nSol] * vtSeg ;
// Distanza del punto soluzione dal piano del disco nella posizione iniziale
double dCurDist = PointPlaneSignedDist( ptC, ptDiskCen, vtMove) ;
+39 -2
View File
@@ -1,13 +1,14 @@
//----------------------------------------------------------------------------
// EgalTech 2016-2020
// EgalTech 2016-2024
//----------------------------------------------------------------------------
// File : CDBoxSurfTm.cpp Data : 09.01.20 Versione : 2.2a2
// File : CDeBoxClosedSurfTm.cpp Data : 24.03.24 Versione : 2.6c2
// Contenuto : Implementazione della verifica di collisione tra
// BoundingBox e Closed SurftriMesh.
//
//
// Modifiche : 05.10.16 DS Creazione modulo.
// 09.01.20 DS Cambio nome alla funzione.
// 24.03.24 DS Aggiunta TestCylSurfTm.
//
//----------------------------------------------------------------------------
@@ -66,3 +67,39 @@ CDeBoxClosedSurfTm( const Frame3d& frBox, const Vector3d& vtDiag, const ISurfTri
// Se il box è interno c'è collisione
return DistBoxCenSurfCalc.IsPointInside() ;
}
//----------------------------------------------------------------------------
// Verifica l'interferenza tra il box e la superficie : restituisce true in caso di interferenza.
//----------------------------------------------------------------------------
bool
TestBoxSurfTm( const Frame3d& frBox, const Vector3d& vtDiag, const ISurfTriMesh& Stm, double dSafeDist)
{
// Se il box non è ben definito non ha senso proseguire
if ( vtDiag.IsSmall())
return true ;
// Se superficie non valida, non ha senso proseguire
if ( ! Stm.IsValid())
return true ;
// Recupero BBox del poliedro
BBox3d b3Poly = Stm.GetAllTriaBox() ;
// Calcolo il BBox del parallelepipedo
BBox3d b3BoxL( ORIG, ORIG + vtDiag) ;
if ( dSafeDist > EPS_SMALL)
b3BoxL.Expand( dSafeDist) ;
BBox3d b3Box = GetToGlob( b3BoxL, frBox) ;
// Se i BBox non interferiscono, non c'è collisione
if ( ! b3Poly.Overlaps( b3Box) || ! b3Poly.Overlaps( frBox, b3BoxL))
return false ;
// Verifico se il parallelepipedo interferisce con i triangoli del poliedro presenti nel suo BBox
INTVECTOR vT ;
Stm.GetAllTriaOverlapBox( b3Box, vT) ;
for ( int nT : vT) {
Triangle3d Tria ;
if ( Stm.GetTriangle( nT, Tria)) {
if ( CDeBoxTria( frBox, vtDiag, Tria, dSafeDist))
return true ;
}
}
// Non c'è interferenza
return false ;
}
+89 -3
View File
@@ -1,12 +1,12 @@
//----------------------------------------------------------------------------
// EgalTech 2020-2020
// EgalTech 2020-2024
//----------------------------------------------------------------------------
// File : CDeSurfTmSurfTm.h Data : 14.06.23 Versione : 2.5f3
// File : CDeClosedSurfTmClosedSurfTm.h Data : 24.03.24 Versione : 2.6c2
// Contenuto : Implementazione funzione verifica collisione tra
// SurfTm e SurfTm.
//
// Modifiche : 13.11.20 LM Creazione modulo.
//
// 24.03.24 DS Aggiunta TestSurfTmSurfTm.
//
//----------------------------------------------------------------------------
@@ -122,3 +122,89 @@ CDeClosedSurfTmClosedSurfTm( const ISurfTriMesh& SurfA, const ISurfTriMesh& Surf
DistPointSurfTm DistPoinBSrfA( ptPointB, *pSrfA) ;
return ( DistPoinASrfB.IsPointInside() || DistPoinBSrfA.IsPointInside()) ;
}
//----------------------------------------------------------------------------
// Verifica l'interferenza tra le due superfici : restituisce true in caso di interferenza.
//----------------------------------------------------------------------------
bool
TestSurfTmSurfTm( const ISurfTriMesh& SurfA, const ISurfTriMesh& SurfB, double dSafeDist)
{
// Recupero le superfici base
const SurfTriMesh* pSrfA = GetBasicSurfTriMesh( &SurfA) ;
const SurfTriMesh* pSrfB = GetBasicSurfTriMesh( &SurfB) ;
// Se le superfici non sono valide, non ha senso proseguire
if ( pSrfA == nullptr || ! pSrfA->IsValid() ||
pSrfB == nullptr || ! pSrfB->IsValid())
return true ;
// Se i box delle superfici non si intersecano, ho finito.
BBox3d b3BoxA, b3BoxB ;
pSrfA->GetLocalBBox( b3BoxA) ;
pSrfB->GetLocalBBox( b3BoxB) ;
// Se è necessario, espando il box di B di una costante additiva pari alla distanza di sicurezza.
if ( dSafeDist > EPS_SMALL)
b3BoxB.Expand( dSafeDist) ;
// Se i box non si sovrappongono, non c'è collisione. Ho finito.
if ( ! b3BoxA.Overlaps( b3BoxB))
return false ;
// Recupero i triangoli di A che interferiscono col box di B
INTVECTOR vTriaIndex ;
pSrfA->GetAllTriaOverlapBox( b3BoxB, vTriaIndex) ;
// Ciclo sui triangoli della superficie A che interferiscono col box della superficie B.
for ( int nTA : vTriaIndex) {
Triangle3d trTriaA ;
if ( ! ( pSrfA->GetTriangle( nTA, trTriaA) && trTriaA.Validate()))
continue ;
BBox3d b3BoxTriaA ;
trTriaA.GetLocalBBox( b3BoxTriaA) ;
// Se è necessario, espando il box di una costante additiva pari alla distanza di sicurezza.
if ( dSafeDist > EPS_SMALL)
b3BoxTriaA.Expand( dSafeDist) ;
// Recupero i triangoli di B che interferiscono col box del triangolo di A
INTVECTOR vNearTria ;
pSrfB->GetAllTriaOverlapBox( b3BoxTriaA, vNearTria) ;
// Settare tutti i triangoli come già processati.
// Al termine della chiamata i TempInt dei triangoli valgono 0.
pSrfB->ResetTempInts() ;
// Ciclo sui triangoli della superficie B che cadono nel box del triangolo corrente della Superficie A.
for ( int nTB : vNearTria) {
// Recupero il triangolo corrente della superficie B.
// Se triangolo non valido salto al successivo.
Triangle3d trTriaB ;
if ( ! ( pSrfB->GetTriangle( nTB, trTriaB) && trTriaB.Validate()))
continue ;
// Se necessario considero l'offset
if ( dSafeDist > EPS_SMALL) {
int nAdjTriaId[3] ;
pSrfB->GetTriangleAdjacencies( nTB, nAdjTriaId) ;
// Ciclo sui vertici del triangolo.
for ( int nVB = 0 ; nVB < 3 ; ++ nVB) {
// Se il triangolo adiacente al triangolo corrente su questo edge
// non è stato processato, processo il vertice e l'edge.
int nAdjTriaTempFlag ;
if ( ! ( pSrfB->GetTempInt( nAdjTriaId[nVB], nAdjTriaTempFlag) || nAdjTriaTempFlag == 0))
continue ;
// Processo il vertice: se c'è collisione fra triangolo A e sfera ho finito.
if ( CDeSimpleSpheTria( trTriaB.GetP( nVB), dSafeDist, trTriaA))
return true ;
// Processo l'edge: se c'è collisione fra triangolo A e cilindro ho finito.
Vector3d vtEdgeV = trTriaB.GetP( ( nVB + 1) % 3) - trTriaB.GetP( nVB) ;
double dEdgeLen = vtEdgeV.Len() ;
vtEdgeV /= dEdgeLen ;
Frame3d frCyl ;
frCyl.Set( trTriaB.GetP( nVB), vtEdgeV) ;
if ( CDeSimpleCylTria( frCyl, dSafeDist, dEdgeLen, trTriaA))
return true ;
}
// Traslo il triangolo
trTriaB.Translate( dSafeDist * trTriaB.GetN()) ;
}
// Processo il triangolo: se i due triangoli collidono ho finito.
if ( CDeTriaTria( trTriaA, trTriaB))
return true ;
// Segno il triangolo come processato: nTemp = 1
pSrfB->SetTempInt( nTB, 1) ;
}
}
// Non c'è interferenza
return false ;
}
+44 -3
View File
@@ -1,12 +1,13 @@
//----------------------------------------------------------------------------
// EgalTech 2020-2020
// EgalTech 2020-2024
//----------------------------------------------------------------------------
// File : CDCylSurfTm.cpp Data : 09.11.20 Versione :
// File : CDeConeFrustumClosedSurfTm.cpp Data : 24.031.24 Versione : 2.6c2
// Contenuto : Implementazione della verifica di collisione tra
// Cone e Closed SurftriMesh.
//
//
// Modifiche : 09.11.20 LM Creazione modulo.
// 24.03.24 DS Aggiunta TestConeFrustumSurfTm.
//
//
//----------------------------------------------------------------------------
@@ -69,4 +70,44 @@ CDeConeFrustumClosedSurfTm( const Frame3d& frCone, double dBaseRad, double dTopR
DistPointSurfTm DistConeCenSurfCalc( ptConeCen, Stm) ;
// Se il tronco di cono è interno c'è collisione
return DistConeCenSurfCalc.IsPointInside() ;
}
}
//----------------------------------------------------------------------------
// Verifica l'interferenza tra il tronco di cono e la superficie : restituisce true in caso di interferenza.
//----------------------------------------------------------------------------
bool
TestConeFrustumSurfTm( const Frame3d& frCone, double dBaseRad, double dTopRad, double dHeight,
const ISurfTriMesh& Stm, double dSafeDist)
{
// Se il tronco di cono non è ben definito non ha senso proseguire
if ( max( dBaseRad, dTopRad) < EPS_SMALL || dHeight < EPS_SMALL)
return true ;
// Se superficie non valida, non ha senso proseguire
if ( ! Stm.IsValid())
return true ;
// Recupero BBox della trimesh
BBox3d b3Surf = Stm.GetAllTriaBox() ;
// Calcolo il BBox del tronco di cono
double dMaxRad = max( dBaseRad, dTopRad) ;
BBox3d b3ConeL( Point3d( -dMaxRad, -dMaxRad, 0),
Point3d( dMaxRad, dMaxRad, dHeight)) ;
if ( dSafeDist > EPS_SMALL)
b3ConeL.Expand( dSafeDist) ;
BBox3d b3Cone = GetToGlob( b3ConeL, frCone) ;
// Se i BBox non interferiscono, non c'è collisione
if ( ! b3Surf.Overlaps( b3Cone) || ! b3Surf.Overlaps( frCone, b3ConeL))
return false ;
// Recupero i triangoli che interferiscono con il box del cono
INTVECTOR vT ;
Stm.GetAllTriaOverlapBox( b3Cone, vT) ;
// Verifico se il tronco di cono interferisce con i triangoli del poliedro presenti nel suo BBox
for ( int nT : vT) {
Triangle3d trTria ;
if ( Stm.GetTriangle( nT, trTria)) {
if ( CDeConeFrustumTria( frCone, dBaseRad, dTopRad, dHeight, trTria, dSafeDist))
return true ;
}
}
// Non c'è interferenza
return false ;
}
+1 -1
View File
@@ -1,7 +1,7 @@
//----------------------------------------------------------------------------
// EgalTech 2020-2020
//----------------------------------------------------------------------------
// File : CDeConTria.cpp Data : 28.10.20 Versione : 2.2k1
// File : CDeConeFrustumTria.h Data : 28.10.20 Versione : 2.2k1
// Contenuto : Dichiarazione della verifica di collisione tra
// Cone e Triangle3d.
//
+42 -3
View File
@@ -1,12 +1,12 @@
//----------------------------------------------------------------------------
// EgalTech 2020-2020
// EgalTech 2020-2024
//----------------------------------------------------------------------------
// File : CDeConvexTorusTria.cpp Data : 18.11.20 Versione :
// File : CDeConvexTorusTria.cpp Data : 24.03.24 Versione : 2.6c2
// Contenuto : Implementazione funzione verifica collisione tra
// toro convesso e SurfTriMesh.
//
// Modifiche : 18.11.20 LM Creazione modulo.
//
// 24.03.24 DS Aggiunta TestConvexTorusSurfTm.
//
//----------------------------------------------------------------------------
@@ -66,3 +66,42 @@ CDeConvexTorusClosedSurfTm( const Frame3d& frTorus, double dRad1, double dRad2,
// Se il toro è interno c'è collisione
return ( DistConeOrigSurfCalc.IsPointInside()) ;
}
//----------------------------------------------------------------------------
// Verifica l'interferenza tra il toro convesso e la superficie : restituisce true in caso di interferenza
//----------------------------------------------------------------------------
bool
TestConvexTorusSurfTm( const Frame3d& frTorus, double dRad1, double dRad2,
const ISurfTriMesh& Stm, double dSafeDist)
{
// I raggi devono essere non nulli
if ( dRad1 < EPS_SMALL || dRad2 < EPS_SMALL)
return true ;
// Se superficie non valida, non ha senso proseguire
if ( ! Stm.IsValid())
return true ;
// Box della superficie
BBox3d b3Surf = Stm.GetAllTriaBox() ;
// Box del toro (sempre completo)
BBox3d b3TorusL( Point3d( -dRad1 - dRad2, -dRad1 - dRad2, -dRad2),
Point3d( dRad1 + dRad2, dRad1 + dRad2, dRad2)) ;
if ( dSafeDist > EPS_SMALL)
b3TorusL.Expand( dSafeDist) ;
BBox3d b3Torus = GetToGlob( b3TorusL, frTorus) ;
// Se i BBox non interferiscono, non c'è collisione
if ( ! b3Surf.Overlaps( b3Torus) || ! b3Surf.Overlaps( frTorus, b3TorusL))
return false ;
// Recupero i triangoli che interferiscono con il box del toro
INTVECTOR vT ;
Stm.GetAllTriaOverlapBox( b3Torus, vT) ;
// Verifico se il toro interferisce con i triangoli del poliedro presenti nel suo BBox
for ( int nT : vT) {
Triangle3d trTria ;
if ( Stm.GetTriangle( nT, trTria)) {
if ( CDeConvexTorusTria( frTorus, dRad1, dRad2, CT_TOT, trTria, dSafeDist))
return true ;
}
}
// Non c'è interferenza
return false ;
}
+45 -2
View File
@@ -1,13 +1,13 @@
//----------------------------------------------------------------------------
// EgalTech 2020-2024
//----------------------------------------------------------------------------
// File : CDCylSurfTm.cpp Data : 15.02.24 Versione : 2.6b2
// File : CDeCylClosedSurfTm.cpp Data : 24.03.24 Versione : 2.6c2
// Contenuto : Implementazione della verifica di collisione tra
// Cylinder e Closed SurftriMesh.
//
//
// Modifiche : 09.01.20 DS Creazione modulo.
//
// 24.03.24 DS Aggiunta TestCylSurfTm.
//
//----------------------------------------------------------------------------
@@ -73,3 +73,46 @@ CDeCylClosedSurfTm( const Frame3d& frCyl, double dR, double dH, const ISurfTriMe
// Se il cilindro è interno c'è collisione
return ( DistCylCenSurfCalc.IsPointInside()) ;
}
//----------------------------------------------------------------------------
// Verifica l'interferenza tra il cilindro e la superficie : restituisce true in caso di interferenza
//----------------------------------------------------------------------------
bool
TestCylSurfTm( const Frame3d& frCyl, double dR, double dH, const ISurfTriMesh& Stm, double dSafeDist)
{
// Il cilindro deve essere ben definito
if ( dR < EPS_SMALL || dH < EPS_SMALL)
return true ;
// Se superficie non valida, non ha senso proseguire
if ( ! Stm.IsValid())
return true ;
// Recupero BBox della superficie poligonale
BBox3d b3Poly = Stm.GetAllTriaBox() ;
// Sistemazioni cilindro
Frame3d frMyCyl = frCyl ;
if ( dH < 0) {
frMyCyl.Translate( dH * frMyCyl.VersZ()) ;
dH = -dH ;
}
// Calcolo il BBox del cilindro
BBox3d b3CylL( Point3d( -dR, -dR, 0),
Point3d( dR, dR, dH)) ;
if ( dSafeDist > EPS_SMALL)
b3CylL.Expand( dSafeDist) ;
BBox3d b3Cyl = GetToGlob( b3CylL, frMyCyl) ;
// Se i BBox non interferiscono, non c'è interferenza
if ( ! b3Poly.Overlaps( b3Cyl) || ! b3Poly.Overlaps( frMyCyl, b3CylL))
return false ;
// Verifico se il cilindro interferisce con i triangoli del poliedro presenti nel suo BBox
INTVECTOR vT ;
Stm.GetAllTriaOverlapBox( b3Cyl, vT) ;
for ( int nT : vT) {
Triangle3d Tria ;
if ( Stm.GetTriangle( nT, Tria)) {
if ( CDeCylTria( frMyCyl, dR, dH, Tria, dSafeDist))
return true ;
}
}
// Non c'è interferenza
return false ;
}
+1 -1
View File
@@ -13,9 +13,9 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "DistPointLine.h"
#include "CDeCylTria.h"
#include "CDeConvexTorusTria.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGkPolygon3d.h"
using namespace std ;
+48 -3
View File
@@ -1,12 +1,12 @@
//----------------------------------------------------------------------------
// EgalTech 2020-2020
// EgalTech 2020-2024
//----------------------------------------------------------------------------
// File : CDePyramidClosedSurfTm.h Data : 09.11.20 Versione :
// File : CDeRectPrismoidClosedSurfTm.h Data : 24.03.24 Versione : 2.6c2
// Contenuto : Implementazione funzione verifica collisione tra
// Prismoide a basi rettangolari e Closed SurfTriMesh.
//
// Modifiche : 09.11.20 LM Creazione modulo.
//
// 24.03.24 DS Aggiunta TestRectPrismoidSurfTm.
//
//----------------------------------------------------------------------------
@@ -74,3 +74,48 @@ CDeRectPrismoidClosedSurfTm( const Frame3d& frPrismoid, double dLenghtBaseX, dou
// C'è collisione se il tronco di piramide è interno
return ( DistPyrCenSurfCalc.IsPointInside()) ;
}
//----------------------------------------------------------------------------
// Verifica l'interferenza tra il Prismoide a basi rettangolari e la superficie : restituisce true in caso di interferenza.
//----------------------------------------------------------------------------
bool
TestRectPrismoidSurfTm( const Frame3d& frPrismoid, double dLenghtBaseX, double dLenghtBaseY,
double dLenghtTopX, double dLenghtTopY, double dHeight,
const ISurfTriMesh& Stm, double dSafeDist)
{
// Se il tronco di piramide non è definito non ha senso proseguire.
if ( max( dLenghtBaseX, dLenghtTopX) < EPS_SMALL ||
max( dLenghtBaseY, dLenghtTopY) < EPS_SMALL ||
dHeight < EPS_SMALL)
return true ;
// Se superficie non valida, non ha senso proseguire
if ( ! Stm.IsValid())
return true ;
// Recupero BBox della trimesh
BBox3d b3Surf = Stm.GetAllTriaBox() ;
// Calcolo il BBox del tronco di piramide
double dMaxLenX = max( dLenghtBaseX, dLenghtTopX) ;
double dMaxLenY = max( dLenghtBaseY, dLenghtTopY) ;
BBox3d b3PyrL( Point3d( -dMaxLenX / 2, -dMaxLenY / 2, 0.),
Point3d( dMaxLenX / 2, dMaxLenY / 2, dHeight)) ;
if ( dSafeDist > EPS_SMALL)
b3PyrL.Expand( dSafeDist) ;
BBox3d b3Pyr = GetToGlob( b3PyrL, frPrismoid) ;
// Se i BBox non interferiscono, non c'è collisione
if ( ! b3Surf.Overlaps( b3Pyr) || ! b3Surf.Overlaps( frPrismoid, b3PyrL))
return false ;
// Recupero i triangoli che interferiscono con il box del tronco di piramide.
INTVECTOR vT ;
Stm.GetAllTriaOverlapBox( b3Pyr, vT) ;
// Verifico se il tronco di piramide interferisce con i triangoli del poliedro presenti nel suo BBox
for ( int nT : vT) {
Triangle3d trTria ;
if ( Stm.GetTriangle( nT, trTria)) {
if ( CDeRectPrismoidTria( frPrismoid, dLenghtBaseX, dLenghtBaseY, dLenghtTopX, dLenghtTopY, dHeight,
trTria, dSafeDist))
return true ;
}
}
// Non c'è interferenza
return false ;
}
+38 -3
View File
@@ -1,13 +1,13 @@
//----------------------------------------------------------------------------
// EgalTech 2020-2020
// EgalTech 2020-2024
//----------------------------------------------------------------------------
// File : CDCylSurfTm.cpp Data : 09.01.20 Versione : 2.2a2
// File : CDCylSurfTm.cpp Data : 24.03.24 Versione : 2.6c2
// Contenuto : Implementazione della verifica di collisione tra
// Sphere e Closed SurftriMesh.
//
//
// Modifiche : 09.01.20 DS Creazione modulo.
//
// 24.03.24 DS Aggiunta TestSpheSurfTm.
//
//----------------------------------------------------------------------------
@@ -60,3 +60,38 @@ CDeSpheClosedSurfTm( const Point3d& ptCen, double dR, const ISurfTriMesh& Stm, d
// C'è collisione se la sfera è interna.
return ( DistCenSurfCalc.IsPointInside()) ;
}
//----------------------------------------------------------------------------
// Verifica l'interferenza tra la sfera e la superficie : restituisce true in caso di interferenza
//----------------------------------------------------------------------------
bool
TestSpheSurfTm( const Point3d& ptCen, double dR, const ISurfTriMesh& Stm, double dSafeDist)
{
// Il raggio deve essere non nullo
if ( dR < EPS_SMALL)
return true ;
// Se superficie non valida, non ha senso proseguire
if ( ! Stm.IsValid())
return true ;
// Recupero BBox del poliedro
BBox3d b3Poly = Stm.GetAllTriaBox() ;
// Calcolo il BBox della sfera
BBox3d b3Sphe( ptCen, dR) ;
if ( dSafeDist > EPS_SMALL)
b3Sphe.Expand( dSafeDist) ;
// Se i BBox non interferiscono, non c'è collisione
if ( ! b3Sphe.Overlaps( b3Poly))
return false ;
// Verifico se la sfera interferisce con i triangoli del poliedro presenti nel suo BBox
INTVECTOR vT ;
Stm.GetAllTriaOverlapBox( b3Sphe, vT) ;
for ( int nT : vT) {
Triangle3d Tria ;
if ( Stm.GetTriangle( nT, Tria)) {
if ( CDeSpheTria( ptCen, dR, Tria, dSafeDist))
return true ;
}
}
// Non c'è interferenza
return false ;
}
+1 -2
View File
@@ -12,11 +12,10 @@
//----------------------------------------------------------------------------
#include "stdafx.h"
#include "DistLineLine.h"
#include "CDeTriaTria.h"
#include "/EgtDev/Include/EGkDistLineLine.h"
#include "/EgtDev/Include/EGkIntersPlanePlane.h"
#include <array>
#include <algorithm>
using namespace std ;
+1 -1
View File
@@ -1,6 +1,6 @@
#include "stdafx.h"
#include "CDeUtility.h"
#include "DistPointLine.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/ENkPolynomialRoots.h"
using namespace std ;
+7938 -1834
View File
File diff suppressed because it is too large Load Diff
+26 -23
View File
@@ -2,7 +2,7 @@
// EgalTech 2013-2014
//----------------------------------------------------------------------------
// File : ChainCurves.cpp Data : 20.07.14 Versione : 1.5g3
// Contenuto : Implementazione della funzione ChainCurves, per creare una o più
// Contenuto : Implementazione della funzione ChainCurves, per creare una o più
// curve composite a partire dalle curve date.
//
//
@@ -43,10 +43,10 @@ bool
ChainCurves::AddCurve( int nId, const Point3d& ptStart, const Vector3d& vtStart,
const Point3d& ptEnd, const Vector3d& vtEnd)
{
// verifico validità Id
// verifico validità Id
if ( nId <= 0)
return false ;
// verifico non sia già stata aggiunta la stessa entità
// verifico non sia già stata aggiunta la stessa entità
if ( ! m_sCrvId.insert( nId).second)
return true ;
// inserisco i dati della curva nel vettore
@@ -68,7 +68,7 @@ ChainCurves::GetChainFromNear( const Point3d& ptStart, bool bHaltOnFork, INTVECT
m_bIsFork = false ;
m_vFork.clear() ;
// recupero l'entità più vicina al punto di start
// recupero l'entità più vicina al punto di start
int nStart ;
INTVECTOR vStart ;
if ( ! m_PointGrid.FindNearest( ptStart, vStart) ||
@@ -82,7 +82,7 @@ ChainCurves::GetChainFromNear( const Point3d& ptStart, bool bHaltOnFork, INTVECT
// tolgo dal grid
RemoveEntityFromGrid( nId) ;
// se devo fermarmi su biforcazione, verifico se sono già su vecchia biforcazione
// se devo fermarmi su biforcazione, verifico se sono già su vecchia biforcazione
bool bSkip = false ;
if ( bHaltOnFork) {
auto iIter = GetForkPoint( m_vCrvData[nId].ptEnd) ;
@@ -93,7 +93,7 @@ ChainCurves::GetChainFromNear( const Point3d& ptStart, bool bHaltOnFork, INTVECT
}
}
// concateno dopo la fine dell'entità di partenza
// concateno dopo la fine dell'entità di partenza
INTVECTOR vIdsAfter ;
bool bClosed = false ;
if ( ! bSkip && ! GetChainFromPoint( m_vCrvData[nId].ptEnd, m_vCrvData[nId].vtEnd,
@@ -102,7 +102,7 @@ ChainCurves::GetChainFromNear( const Point3d& ptStart, bool bHaltOnFork, INTVECT
return false ;
}
// se devo fermarmi su biforcazione, verifico se sono già su vecchia biforcazione
// se devo fermarmi su biforcazione, verifico se sono già su vecchia biforcazione
bool bRevSkip = false ;
if ( bHaltOnFork) {
auto iIter = GetForkPoint( m_vCrvData[nId].ptStart) ;
@@ -113,7 +113,7 @@ ChainCurves::GetChainFromNear( const Point3d& ptStart, bool bHaltOnFork, INTVECT
}
}
// se non ho già chiuso l'anello, concateno prima dell'inizio dell'entità di partenza
// se non ho già chiuso l'anello, concateno prima dell'inizio dell'entità di partenza
INTVECTOR vIdsBefore ;
if ( ! bClosed) {
bool bRevClosed ;
@@ -258,7 +258,7 @@ ChainCurves::RemoveEntityFromGrid( int nId)
bool
ChainCurves::ChooseStart( const Point3d& ptStart, const INTVECTOR& vStart, int& nStart)
{
// numero di entità candidate
// numero di entità candidate
int nSize = int( vStart.size()) ;
// se nessuna, errore
@@ -273,7 +273,7 @@ ChainCurves::ChooseStart( const Point3d& ptStart, const INTVECTOR& vStart, int&
// altrimenti, cerco la migliore
int nI = - 1 ;
double dSqDistMin = SQ_INFINITO ;
double dDistMin = INFINITO ;
for ( int i = 0 ; i < nSize ; ++ i) {
// recupero indice e verso
int nId = abs( vStart[i]) - 1 ;
@@ -281,9 +281,12 @@ ChainCurves::ChooseStart( const Point3d& ptStart, const INTVECTOR& vStart, int&
// calcolo un punto vicino all'estremo lungo la tangente
Point3d ptNear = ( bEquiv ? m_vCrvData[nId].ptStart + m_vCrvData[nId].vtStart :
m_vCrvData[nId].ptEnd - m_vCrvData[nId].vtEnd) ;
double dSqDist = SqDist( ptStart, ptNear) ;
if ( dSqDist < dSqDistMin) {
dSqDistMin = dSqDist ;
double dDist = Dist( ptStart, ptNear) ;
// tengo il segmento più vicino al punto
// favorendo eventualmente quello equiverso se entro EPS da un concorrente
if ( dDist < dDistMin - EPS_SMALL ||
((dDist < dDistMin + EPS_SMALL) && bEquiv && vStart[nI] < 0)) {
dDistMin = dDist ;
nI = i ;
}
}
@@ -302,7 +305,7 @@ bool
ChainCurves::ChooseNext( const Point3d& ptCurr, const Vector3d& vtCurr, const INTVECTOR& vNext, bool bHaltOnFork, int& nNext)
{
INTVECTOR vMyNext = vNext ;
// scarto quelle entità che sono più vicine all'altro estremo del più vicino
// scarto quelle entità che sono più vicine all'altro estremo del più vicino
int nM = -1 ;
Point3d ptRef ;
double dSqMinDist = m_dToler * m_dToler ;
@@ -319,19 +322,19 @@ ChainCurves::ChooseNext( const Point3d& ptCurr, const Vector3d& vtCurr, const IN
}
}
for ( int i = 0 ; i < int( vMyNext.size()) ; ++ i) {
// salto l'entità più vicina
// salto l'entità più vicina
if ( i == nM)
continue ;
// recupero indice e verso
int nId = abs( vMyNext[i]) - 1 ;
bool bEquiv = ( vMyNext[i] > 0) ;
// verifico se più vicino al più vicino
// verifico se più vicino al più vicino
double dCurrSqDist = SqDist( ptCurr, ( bEquiv ? m_vCrvData[nId].ptStart : m_vCrvData[nId].ptEnd)) ;
double dRefSqDist = SqDist( ptRef, ( bEquiv ? m_vCrvData[nId].ptStart : m_vCrvData[nId].ptEnd)) ;
if ( dRefSqDist < dCurrSqDist)
vMyNext[i] = 0 ;
}
// cerco la direzione più vicina
// cerco la direzione più vicina
int nI = -1 ;
int nF = 0 ;
INTVECTOR vFork ;
@@ -343,7 +346,7 @@ ChainCurves::ChooseNext( const Point3d& ptCurr, const Vector3d& vtCurr, const IN
// recupero indice e verso
int nId = abs( vMyNext[i]) - 1 ;
bool bEquiv = ( vMyNext[i] > 0) ;
// incremento contatore indice entità tra cui scegliere
// incremento contatore indice entità tra cui scegliere
++ nF ;
vFork.push_back( vMyNext[i]) ;
// se vietata inversione, salto se controverso
@@ -387,7 +390,7 @@ bool
ChainCurves::ChoosePrev( const Point3d& ptCurr, const Vector3d& vtCurr, const INTVECTOR& vPrev, bool bHaltOnFork, int& nPrev)
{
INTVECTOR vMyPrev = vPrev ;
// scarto quelle entità che sono più vicine all'altro estremo del più vicino
// scarto quelle entità che sono più vicine all'altro estremo del più vicino
int nM = -1 ;
Point3d ptRef ;
double dSqMinDist = m_dToler * m_dToler ;
@@ -404,19 +407,19 @@ ChainCurves::ChoosePrev( const Point3d& ptCurr, const Vector3d& vtCurr, const IN
}
}
for ( int i = 0 ; i < int( vMyPrev.size()) ; ++ i) {
// salto l'entità più vicina
// salto l'entità più vicina
if ( i == nM)
continue ;
// recupero indice e verso
int nId = abs( vMyPrev[i]) - 1 ;
bool bEquiv = ( vMyPrev[i] < 0) ;
// verifico se più vicino al più vicino
// verifico se più vicino al più vicino
double dCurrSqDist = SqDist( ptCurr, ( bEquiv ? m_vCrvData[nId].ptEnd : m_vCrvData[nId].ptStart)) ;
double dRefSqDist = SqDist( ptRef, ( bEquiv ? m_vCrvData[nId].ptEnd : m_vCrvData[nId].ptStart)) ;
if ( dRefSqDist < dCurrSqDist)
vMyPrev[i] = 0 ;
}
// cerco la direzione più vicina
// cerco la direzione più vicina
int nI = - 1 ;
int nF = 0 ;
double dProScaMax = - 1.1 ;
@@ -428,7 +431,7 @@ ChainCurves::ChoosePrev( const Point3d& ptCurr, const Vector3d& vtCurr, const IN
// recupero indice e verso
int nId = abs( vMyPrev[i]) - 1 ;
bool bEquiv = ( vMyPrev[i] < 0) ;
// incremento contatore indice entità tra cui scegliere
// incremento contatore indice entità tra cui scegliere
++ nF ;
vFork.push_back( vMyPrev[i]) ;
// se vietata inversione, salto se controverso
+1 -1
View File
@@ -16,8 +16,8 @@
#include "CurveBezier.h"
#include "CurveComposite.h"
#include "CreateCurveAux.h"
#include "DistPointLine.h"
#include "GeoConst.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGkCircleCenTgCurve.h"
#include "/EgtDev/Include/EGkDistPointCurve.h"
#include "/EgtDev/Include/EgtPointerOwner.h"
+57 -46
View File
@@ -189,7 +189,7 @@ CurveArc::Set3P( const Point3d& ptStart, const Point3d& ptOther, const Point3d&
// calcolo del versore normale
m_VtN = vtA ^ vtB ;
double dNSqLen = m_VtN.SqLen() ;
// se i punti sono praticamente allineati non si può calcolare la circonferenza
// se i punti sono praticamente allineati non si può calcolare la circonferenza
if ( ! m_VtN.Normalize( EPS_ZERO))
return false ;
// calcolo del centro
@@ -216,17 +216,17 @@ CurveArc::Set3P( const Point3d& ptStart, const Point3d& ptOther, const Point3d&
if ( ! m_VtS.GetRotation( ( ptEnd - m_PtCen), m_VtN, dAng2Deg, bDet2) || ! bDet2)
return false ;
// deduzione dell'angolo al centro
// se uno dei due angoli è nullo, errore
// se uno dei due angoli è nullo, errore
if ( abs( dAng1Deg) < EPS_ANG_SMALL || abs( dAng2Deg) < EPS_ANG_SMALL)
return false ;
// se i due angoli hanno lo stesso segno e Ang1 è minore di Ang2 in modulo
// se i due angoli hanno lo stesso segno e Ang1 è minore di Ang2 in modulo
else if ( dAng1Deg * dAng2Deg > 0 && abs( dAng1Deg) < abs( dAng2Deg))
m_dAngCenDeg = dAng2Deg ;
// altrimenti hanno segno opposto oppure Ang1 è maggiore di Ang2 in modulo
// altrimenti hanno segno opposto oppure Ang1 è maggiore di Ang2 in modulo
else
m_dAngCenDeg = - _copysign( ANG_FULL, dAng2Deg) + dAng2Deg ;
}
// non c'è DeltaN
// non c'è DeltaN
m_dDeltaN = 0 ;
// imposto ricalcolo di Voronoi
@@ -255,7 +255,7 @@ CurveArc::Set2PNB( const Point3d& ptIni, const Point3d& ptFin, const Vector3d& v
Vector3d vtDiff = ptFin - ptIni ;
if ( vtDiff.IsSmall())
return false ;
// deltaN eventuale ( è componente parallela a VtN)
// deltaN eventuale ( è componente parallela a VtN)
m_dDeltaN = vtDiff * m_VtN ;
vtDiff -= m_dDeltaN * m_VtN ;
if ( abs( m_dDeltaN) < EPS_SMALL)
@@ -304,7 +304,7 @@ CurveArc::Set2PD( const Point3d& ptStart, const Point3d& ptEnd, double dDirStart
// calcolo del versore normale
m_VtN = vtA ^ vtB ;
double dNSqLen = m_VtN.SqLen() ;
// se tangente e punti sono praticamente allineati non si può calcolare la circonferenza
// se tangente e punti sono praticamente allineati non si può calcolare la circonferenza
if ( ! m_VtN.Normalize( EPS_ZERO))
return false ;
// calcolo del centro
@@ -321,7 +321,7 @@ CurveArc::Set2PD( const Point3d& ptStart, const Point3d& ptEnd, double dDirStart
double dAng1Deg ;
if ( ! m_VtS.GetRotation( ( ptEnd - m_PtCen), m_VtN, dAng1Deg, bDet1) || ! bDet1)
return false ;
// poichè il senso di rotazione è sempre CCW, se l'angolo è negativo prendo il suo complemento al giro
// poichè il senso di rotazione è sempre CCW, se l'angolo è negativo prendo il suo complemento al giro
if ( dAng1Deg < 0)
m_dAngCenDeg = ANG_FULL + dAng1Deg ;
else
@@ -398,7 +398,7 @@ CurveArc::Set2PRS( const Point3d& ptStart, const Point3d& ptEnd, double dRad, bo
if ( dLenA > ( dRad - EPS_ZERO))
dLenH = 0 ;
else
dLenH= sqrt( dRad * dRad - dLenA * dLenA) ;
dLenH = sqrt( dRad * dRad - dLenA * dLenA) ;
// versore dal punto medio della corda al centro
Vector3d vtH = vtA / dLenA ;
vtH.Rotate( Z_AX, 0, ( bCCW ? 1 : -1)) ;
@@ -410,11 +410,12 @@ CurveArc::Set2PRS( const Point3d& ptStart, const Point3d& ptEnd, double dRad, bo
m_dRad = dRad ;
// calcolo il versore di start
m_VtS = ( ptStart - m_PtCen) / m_dRad ;
m_VtS.Normalize() ;
// calcolo l'angolo al centro
bool bDet ;
if ( ! m_VtS.GetRotation( ( ptEnd - m_PtCen), m_VtN, m_dAngCenDeg, bDet) || ! bDet)
return false ;
// quando è 180deg il segno è determinato solo dal senso
// quando è 180deg il segno è determinato solo dal senso
if ( abs( m_dAngCenDeg - ANG_STRAIGHT) < 10 * EPS_ANG_SMALL &&
( ( bCCW && m_dAngCenDeg < 0) ||
( ! bCCW && m_dAngCenDeg > 0)))
@@ -529,7 +530,7 @@ CurveArc::SetC2P( const Point3d& ptCen, const Point3d& ptStart, const Point3d& p
if ( m_dRad < EPS_ZERO)
return false ;
m_VtS /= m_dRad ;
// calcolo l'angolo al centro (la funzione trova sempre il più piccolo)
// calcolo l'angolo al centro (la funzione trova sempre il più piccolo)
bool bDet ;
if ( ! m_VtS.GetRotation( ( ptNearEnd - m_PtCen), m_VtN, m_dAngCenDeg, bDet) || ! bDet)
return false ;
@@ -733,7 +734,7 @@ CurveArc::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
// verifico lo stato
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// assegno il box nel riferimento
@@ -820,7 +821,7 @@ CurveArc::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
}
}
// se c'è estrusione, devo tenerne conto
// se c'è estrusione, devo tenerne conto
if ( ! m_VtExtr.IsSmall() && abs( m_dThick) > EPS_SMALL) {
Vector3d vtFrExtr = m_VtExtr ;
vtFrExtr.ToGlob( frRef) ;
@@ -838,7 +839,7 @@ bool
CurveArc::Validate( void)
{
if ( m_nStatus == TO_VERIFY) {
// limito l'angolo al centro a un giro se è piatto ( non è elica)
// limito l'angolo al centro a un giro se è piatto ( non è elica)
if ( abs( m_dDeltaN) < EPS_SMALL) {
if ( m_dAngCenDeg > ANG_FULL)
m_dAngCenDeg = ANG_FULL ;
@@ -1167,7 +1168,7 @@ CurveArc::ApproxWithLines( double dLinTol, double dAngTolDeg, int nType, PolyLin
return false ;
}
// se necessario, sistemo per convessità dalla parte ammessa
// se necessario, sistemo per convessità dalla parte ammessa
if ( nType == APL_RIGHT_CONVEX || nType == APL_LEFT_CONVEX) {
if ( ! PL.MakeConvex( vtExtr, ( nType == APL_LEFT_CONVEX)))
return false ;
@@ -1241,7 +1242,7 @@ CurveArc::CopyParamRange( double dUStart, double dUEnd) const
return nullptr ;
// se il parametro start supera quello di end
if ( dUStart > dUEnd - EPS_PARAM) {
// se curva aperta, il trim la cancella completamente quindi non resta alcunchè
// se curva aperta, il trim la cancella completamente quindi non resta alcunchè
if ( ! IsClosed())
return nullptr ;
// se curva chiusa, il trim si avvolge attorno al punto di giunzione
@@ -1331,7 +1332,7 @@ bool
CurveArc::MyExtendedOffset( double dDist, bool bAll, int nType)
{
// bAll == true fa accettare raggi nulli ==> da usare solo internamente
// quando si è sicuri di aumentare subito il raggio o di cancellare
// quando si è sicuri di aumentare subito il raggio o di cancellare
// la curva deve essere validata
if ( m_nStatus != OK)
@@ -1409,7 +1410,7 @@ CurveArc::ModifyEnd( const Point3d& ptNewEnd)
ptOldEndIntr.ToLoc( frIntr) ;
Point3d ptEndIntr = ptNewEnd ;
ptEndIntr.ToLoc( frIntr) ;
// se coincidono nel piano XY, è cambiato solo il deltaN
// se coincidono nel piano XY, è cambiato solo il deltaN
if ( AreSamePointXYExact( ptOldEndIntr, ptEndIntr)) {
m_dDeltaN += ptEndIntr.z - ptOldEndIntr.z ;
}
@@ -1615,8 +1616,10 @@ CurveArc::Translate( const Vector3d& vtMove)
if ( m_nStatus != OK)
return false ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// traslo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->Translate( vtMove) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -1634,12 +1637,14 @@ CurveArc::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, dou
if ( m_nStatus != OK)
return false ;
// verifico validità dell'asse di rotazione
// verifico validità dell'asse di rotazione
if ( vtAx.IsSmall())
return false ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// ruoto Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->Rotate( ptAx, vtAx, dCosAng, dSinAng) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -1787,7 +1792,7 @@ CurveArc::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
if ( m_nStatus != OK)
return false ;
// verifico validità del piano di specchiatura
// verifico validità del piano di specchiatura
if ( vtNorm.IsSmall())
return false ;
@@ -1815,11 +1820,11 @@ CurveArc::Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d& vt
if ( m_nStatus != OK)
return false ;
// verifico validità dei parametri
// verifico validità dei parametri
if ( vtNorm.IsSmall() || vtDir.IsSmall())
return false ;
// possibile solo se l'arco è piatto e il piano di scorrimento coincide con quello dell'arco
// possibile solo se l'arco è piatto e il piano di scorrimento coincide con quello dell'arco
if ( ! ( abs( m_dDeltaN) < EPS_SMALL) ||
! AreSameOrOppositeVectorExact( m_VtN, vtNorm))
return false ;
@@ -1849,16 +1854,18 @@ CurveArc::ToGlob( const Frame3d& frRef)
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// se frame identità, non devo fare alcunché
// se frame identità, non devo fare alcunché
if ( IsGlobFrame( frRef))
return true ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->ToGlob( frRef) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -1876,16 +1883,18 @@ CurveArc::ToLoc( const Frame3d& frRef)
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// se frame identità, non devo fare alcunché
// se frame identità, non devo fare alcunché
if ( IsGlobFrame( frRef))
return true ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->ToLoc( frRef) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -1903,16 +1912,18 @@ CurveArc::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità dei frame
// verifico validità dei frame
if ( frOri.GetType() == Frame3d::ERR || frDest.GetType() == Frame3d::ERR)
return false ;
// se i due riferimenti coincidono, non devo fare alcunché
// se i due riferimenti coincidono, non devo fare alcunché
if ( AreSameFrame( frOri, frDest))
return true ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->LocToLoc( frOri, frDest) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -1989,12 +2000,12 @@ CurveArc::MyCalcPointParamPosiz( const Point3d& ptP, double& dU, int& nPos, doub
// verifica posizione punto su arco
nPos = PP_NULL ; // fuori
if ( abs( DiffAngle( dAngDeg, 0) * DEGTORAD * m_dRad) < dLinTol) {
nPos = ( IsACircle() ? PP_MID : PP_START) ; // se cerchio è interno, altrimenti vicino a inizio
nPos = ( IsACircle() ? PP_MID : PP_START) ; // se cerchio è interno, altrimenti vicino a inizio
dU = AngleNearAngle( dAngDeg, 0) / m_dAngCenDeg ;
dU = max( dU, 0.) ;
}
else if ( abs( DiffAngle( dAngDeg, m_dAngCenDeg) * DEGTORAD * m_dRad) < dLinTol) {
nPos = ( IsACircle() ? PP_MID : PP_END) ; // se cerchio è interno, altrimenti vicino a fine
nPos = ( IsACircle() ? PP_MID : PP_END) ; // se cerchio è interno, altrimenti vicino a fine
dU = AngleNearAngle( dAngDeg, m_dAngCenDeg) / m_dAngCenDeg ;
dU = min( dU, 1.) ;
}
@@ -2011,7 +2022,7 @@ CurveArc::ChangeRadius( double dNewRadius)
if ( m_nStatus != OK)
return false ;
// verifico validità del raggio
// verifico validità del raggio
if ( ! ( dNewRadius > EPS_SMALL && dNewRadius < MAX_ARC_RAD))
return false ;
@@ -2057,7 +2068,7 @@ CurveArc::ChangeAngCenter( double dNewAngCenDeg)
if ( m_nStatus != OK)
return false ;
// verifico accettabilità angolo
// verifico accettabilità angolo
if ( ! ( abs( m_dAngCenDeg) > EPS_ANG_ZERO))
return false ;
@@ -2153,11 +2164,11 @@ CurveArc::Flip( void)
//----------------------------------------------------------------------------
// Oggetto locale per approssimazione di archi
// Approx interna è quella cordale standard.
// Approx esterna è quella tangente a inizio e fine con metà tratto e un punto in più.
// Approx interna è quella cordale standard.
// Approx esterna è quella tangente a inizio e fine con metà tratto e un punto in più.
// I punti si calcolano a partire dal triangolo tra due punti consecutivi interni e il centro,
// usando il versore medio dal centro e moltiplicandolo per il coefficiente ( 2 / ( 1 + cosA)).
// Il versore dell'ultimo punto è già stato calcolato per il penultimo.
// Il versore dell'ultimo punto è già stato calcolato per il penultimo.
//----------------------------------------------------------------------------
ArcApproxer::ArcApproxer( double dLinTol, double dAngTolDeg, bool bInside, const CurveArc& arArc)
{
@@ -2281,7 +2292,7 @@ CurveArc::GetVoronoiObject() const
if ( m_nStatus != OK)
return nullptr ;
// se non è stato calcolato, lo calcolo
// se non è stato calcolato, lo calcolo
if ( m_pVoronoiObj == nullptr)
CalcVoronoiObject() ;
+5 -2
View File
@@ -186,7 +186,10 @@ class CurveArc : public ICurveArc, public IGeoObjRW
public : // IGeoObjRW
int GetNgeId( void) const override ;
bool Save( NgeWriter& ngeOut) const override ;
bool PreSave( GdbGeo& Wrapper) const override { return true ; }
bool PostSave( GdbGeo& Wrapper) const override { return true ; }
bool Load( NgeReader& ngeIn) override ;
bool PostLoad( GdbGeo& Wrapper) override { return true ; }
public :
CurveArc( void) ;
@@ -200,13 +203,13 @@ class CurveArc : public ICurveArc, public IGeoObjRW
bool MyExtendedOffset( double dDist, bool bAll, int nType = OFF_FILLET) ;
bool MyCalcPointParamPosiz( const Point3d& ptP, double& dU, int& nPos, double dLinTol) const ;
Voronoi* GetVoronoiObject( void) const ;
void ResetVoronoiObject( void) const ;
private :
bool CopyFrom( const CurveArc& caSrc) ;
bool Validate( void) ;
bool GetDir( double dU, Vector3d& vtDir) const ;
bool CalcVoronoiObject( void) const ;
void ResetVoronoiObject( void) const ;
private :
enum Status { ERR = 0, OK = 1, TO_VERIFY = 2} ;
@@ -222,7 +225,7 @@ class CurveArc : public ICurveArc, public IGeoObjRW
double m_dDeltaN ; // variazione di quota lungo VtN della fine rispetto all'inizio
Vector3d m_VtExtr ; // vettore estrusione (normalmente coincide con m_VtN)
double m_dThick ; // spessore
int m_nTempProp[2] ; // vettore proprietà temporanee
int m_nTempProp[2] ; // vettore proprietà temporanee
double m_dTempParam[2] ; // vettore parametri temporanei
mutable Voronoi* m_pVoronoiObj ; // Voronoi
} ;
+1167 -59
View File
File diff suppressed because it is too large Load Diff
+1
View File
@@ -33,4 +33,5 @@ bool CurveGetArea( const ICurve& crvC, Plane3d& plPlane, double& dArea) ;
bool CurveDump( const ICurve& crvC, std::string& sOut, bool bMM, const char* szNewLine) ;
bool CopyExtrusion( const ICurve* pSouCrv, ICurve* pDestCrv) ;
bool CopyThickness( const ICurve* pSouCrv, ICurve* pDestCrv) ;
ICurveBezier* ApproxCurveBezierWithSingleCubic( const ICurve* pCrv) ;
Voronoi* GetCurveVoronoi( const ICurve& crvC) ;
+266 -16
View File
@@ -13,13 +13,13 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "CurveAux.h"
#include "CurveBezier.h"
#include "CurveComposite.h"
#include "DistPointCrvBezier.h"
#include "BiArcs.h"
#include "GeoConst.h"
#include "PolygonPlane.h"
#include "DistPointLine.h"
#include "GeoObjFactory.h"
#include "NgeWriter.h"
#include "NgeReader.h"
@@ -27,12 +27,16 @@
#include "Bernstein.h"
#include "deCasteljau.h"
#include "Voronoi.h"
#include "IntersLineLine.h"
#include "/EgtDev/Include/EGkCurveArc.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGkStringUtils3d.h"
#include "/EgtDev/Include/EGkUiUnits.h"
#include "/EgtDev/Include/ENkPolynomial.h"
#include "/EgtDev/Include/EgtNumUtils.h"
#include "/EgtDev/Include/EgtPointerOwner.h"
#include "/EgtDev/Include/EGkGeoPoint3d.h"
#include "/EgtDev/Include/EGkCurveLine.h"
#include <array>
using namespace std ;
@@ -138,6 +142,32 @@ CurveBezier::SetControlPoint( int nInd, const Point3d& ptCtrl, double dW)
return true ;
}
//----------------------------------------------------------------------------
bool
CurveBezier::SetControlWeight( int nInd, double dW)
{
// verifico validità, razionalità e indice
if ( m_nStatus != OK || ! m_bRat || nInd < 0 || nInd > m_nDeg)
return false ;
// verifico che il peso non sia nullo o negativo
if ( dW < EPS_SMALL)
return false ;
// assegno il valore e il peso
m_vWeCtrl[nInd] = dW ;
// annullo analisi presenza singolarità
m_dParSing = - 2 ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
return true ;
}
//----------------------------------------------------------------------------
bool
CurveBezier::FromArc( const ICurveArc& crArc)
@@ -195,6 +225,35 @@ CurveBezier::FromArc( const ICurveArc& crArc)
SetControlPoint( 1, ptNew1, dW) ;
SetControlPoint( 2, ptNew2, dW) ;
SetControlPoint( 3, ptEnd, 1) ;
//// anziché usare una bezier cubica approssimo le eliche con più bezier quadratiche razionali.
//// più è grande l'angolo al centro dell'arco e maggiore sarà l'errore di approssimazione
//
// // quadratica razionale
// // peso del punto di controllo intermedio
// double dW = dCosAhalf ;
// // calcolo dei punti di controllo
// Point3d ptStart ;
// crArc.GetStartPoint( ptStart) ;
// Point3d ptEnd ;
// crArc.GetEndPoint( ptEnd) ;
// // Point3d ptMed = Media( ptStart, ptEnd, 0.5) ;
// //Vector3d vtDir = ptMed - crArc.GetCenter() ;
// // Point3d ptNew = crArc.GetCenter() + vtDir / ( dCosAhalf * dCosAhalf) ;
// Vector3d vtStart ; crArc.GetStartDir( vtStart) ;
// Vector3d vtEnd ; crArc.GetEndDir( vtEnd) ;
// PtrOwner<CurveLine> pCrvLine1( CreateBasicCurveLine()) ;
// pCrvLine1->SetPVL( ptStart, vtStart, 10) ;
// PtrOwner<CurveLine> pCrvLine2( CreateBasicCurveLine()) ;
// pCrvLine2->SetPVL( ptEnd, vtEnd, 10) ;
// IntersLineLine ill( *pCrvLine1, *pCrvLine2, false) ;
// IntCrvCrvInfo iccInfo ; ill.GetIntCrvCrvInfo( iccInfo) ;
// Point3d ptNew = 0.5 * (iccInfo.IciA->ptI + iccInfo.IciB->ptI) ;
// // inserimento nella curva dei punti di controllo con i pesi
// Init( 2, true) ;
// SetControlPoint( 0, ptStart, 1) ;
// SetControlPoint( 1, ptNew, dW) ;
// SetControlPoint( 2, ptEnd, 1) ;
}
// copio estrusione e spessore
@@ -204,6 +263,30 @@ CurveBezier::FromArc( const ICurveArc& crArc)
return true ;
}
//----------------------------------------------------------------------------
bool
CurveBezier::FromLine( const ICurveLine& crLine)
{
if ( ! crLine.IsValid())
return false ;
double dWeight = 1 ;
int nCount = 0 ;
Point3d ptStart ; crLine.GetStartPoint( ptStart) ;
SetControlPoint( nCount, ptStart, dWeight) ;
++nCount ;
double dPart = 1. / m_nDeg ;
for ( int i = 1 ; i < m_nDeg ; ++i) {
double dU = i * dPart ;
Point3d ptMid ; crLine.GetPointD1D2( dU, ICurve::FROM_MINUS, ptMid) ;
SetControlPoint( nCount, ptMid, dWeight) ;
++nCount ;
}
Point3d ptEnd ; crLine.GetEndPoint( ptEnd) ;
SetControlPoint( nCount, ptEnd, dWeight) ;
++nCount ;
return true ;
}
//----------------------------------------------------------------------------
bool
CurveBezier::IsAPoint( void) const
@@ -286,6 +369,7 @@ CurveBezier::CopyFrom( const CurveBezier& cbSrc)
return true ;
if ( ! Init( cbSrc.m_nDeg, cbSrc.m_bRat))
return false ;
m_dParSing = cbSrc.m_dParSing ;
m_vPtCtrl = cbSrc.m_vPtCtrl ;
if ( cbSrc.m_bRat)
m_vWeCtrl = cbSrc.m_vWeCtrl ;
@@ -1486,7 +1570,7 @@ CurveBezier::BiArcOrSplit( int nLev, PolyLine& PL, double dLinTol, double dAngTo
return false ;
vtDir.ToSpherical( nullptr, nullptr, &dDir1Deg) ;
// costruisco un biarco sulla polilinea (secondo metodo di Z. Sir)
pCrv.Set( GetBiArc( ptP0, dDir0Deg, ptP1, dDir1Deg, PL, dMaxDist)) ;
pCrv.Set( GetBiArc( ptP0, dDir0Deg, ptP1, dDir1Deg, PL, dMaxDist, dLinTol)) ;
if ( IsNull( pCrv))
return false ;
}
@@ -1723,12 +1807,24 @@ CurveBezier::TrimStartEndAtParam( double dUStartTrim, double dUEndTrim)
// verifico che i trim non cancellino interamente la curva
if ( dUStartTrim > dUEndTrim - EPS_PARAM)
return false ;
// se razionale devo trovare il punto di trim iniziale per ricalcolare il parametro di trim
Point3d ptStart ;
if( m_bRat)
GetPointD1D2( dUStartTrim, ptStart) ;
// trim finale
if ( ! TrimEndAtParam( dUEndTrim))
return false ;
// trim iniziale con il parametro opportunamente ricalcolato
double dNewUStartTrim = dUStartTrim / dUEndTrim ;
return TrimStartAtParam( dNewUStartTrim) ;
double dNewUStartTrim ;
if( m_bRat)
GetParamAtPoint( ptStart, dNewUStartTrim) ;
else
dNewUStartTrim = dUStartTrim / dUEndTrim ;
//trim iniziale
if( ! TrimStartAtParam( dNewUStartTrim))
return false ;
return true ;
}
//----------------------------------------------------------------------------
@@ -1744,7 +1840,10 @@ CurveBezier::TrimStartAtLen( double dLenTrim)
return false ;
// utilizzo il trim sui parametri
return TrimStartAtParam( dUTrim) ;
if( ! TrimStartAtParam( dUTrim))
return false ;
return true ;
}
//----------------------------------------------------------------------------
@@ -1760,7 +1859,10 @@ CurveBezier::TrimEndAtLen( double dLenTrim)
return false ;
// utilizzo il trim sui parametri
return TrimEndAtParam( dUTrim) ;
if( ! TrimEndAtParam( dUTrim))
return false ;
return true ;
}
//----------------------------------------------------------------------------
@@ -1873,8 +1975,10 @@ CurveBezier::Translate( const Vector3d& vtMove)
if ( m_nStatus != OK)
return false ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// traslo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->Translate( vtMove) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -1897,8 +2001,10 @@ CurveBezier::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng,
if ( vtAx.IsSmall())
return false ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// ruoto Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->Rotate( ptAx, vtAx, dCosAng, dSinAng) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -2032,8 +2138,10 @@ CurveBezier::ToGlob( const Frame3d& frRef)
if ( IsGlobFrame( frRef))
return true ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->ToGlob( frRef) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -2061,8 +2169,10 @@ CurveBezier::ToLoc( const Frame3d& frRef)
if ( IsGlobFrame( frRef))
return true ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->ToLoc( frRef) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -2090,8 +2200,10 @@ CurveBezier::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
if ( AreSameFrame( frOri, frDest))
return true ;
// imposto ricalcolo Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->LocToLoc( frOri, frDest) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -2142,3 +2254,141 @@ CurveBezier::ResetVoronoiObject() const
delete m_pVoronoiObj ;
m_pVoronoiObj = nullptr ;
}
//----------------------------------------------------------------------------
bool
CurveBezier::MakeRational( void)
{
if ( m_bRat)
return true ;
// creo il vettore dei pesi e li setto tutti a 1
m_vWeCtrl.assign( m_nDeg + 1, 1) ;
// aggiorno il flag rational
m_bRat = true ;
return true ;
}
//----------------------------------------------------------------------------
bool
CurveBezier::MakeRationalStandardForm( void)
{
if ( ! m_bRat)
return false ;
double dW0 = m_vWeCtrl.front() ;
double dWn = m_vWeCtrl.back() ;
if ( dW0 > 1 - EPS_ZERO && dWn > 1 - EPS_ZERO)
return true ;
if ( dW0 < EPS_ZERO || dWn < EPS_ZERO)
return false ;
// formula del Farin
double dCoeff = pow( dW0 / dWn, 1. / m_nDeg) ;
for ( int i = 0 ; i < m_nDeg + 1 ; ++i)
m_vWeCtrl[i] *= Pow( dCoeff, i) / dW0 ;
return true ;
}
//----------------------------------------------------------------------------
bool
CurveBezier::MakeNonRational( double dTol)
{
if ( ! m_bRat)
return true ;
// controllo se i pesi sono tutti == 1 allora è una finta razionale e mi basta fare una copia dei punti di controllo
bool bIsActualRat = false ;
for ( int i = 0 ; i < m_nDeg ; ++i) {
if ( abs( m_vWeCtrl[i] - 1) > EPS_SMALL) {
bIsActualRat = true ;
break ;
}
}
bool bOk = true ;
if ( ! bIsActualRat) {
PtrOwner<CurveBezier> pNewBez( CreateBasicCurveBezier()) ;
for ( int p = 0 ; p < m_nDeg ; ++p) {
Point3d pt = GetControlPoint( p) ;
pNewBez->SetControlPoint( p, pt) ;
}
}
else {
// provo ad approssimare la curva di bezier con una controparte non razionale
int nDeg = m_nDeg ;
// punto di rientro in caso fallisca il primo tentativo
retry :
nDeg += 2 ;
PtrOwner<CurveBezier> pNewBez( CreateBasicCurveBezier()) ;
pNewBez->Init( nDeg, false) ;
PNTVECTOR vPntCtrl ;
PNTVECTOR vPntSampling ;
for ( int p = 0 ; p < nDeg + 1 ; ++p) {
Point3d pt ; GetPointD1D2( double( p) / nDeg, pt) ;
pNewBez->SetControlPoint( p, pt) ;
vPntCtrl.push_back( pt) ;
}
vPntSampling = vPntCtrl ;
int c = 0 ;
double dErr = INFINITO ;
while ( dErr > dTol && c < 100) {
double dErrMax = 0 ;
// calcolo le differenze tra i punti di sampling sulla nuova curva e quelli sulla curva originale
for ( int p = 0 ; p < nDeg + 1 ; ++p) {
Point3d pt ; pNewBez->GetPointD1D2( double( p) / nDeg, pt) ;
Vector3d vDiff = vPntSampling[p] - pt ;
double dErrLoc = vDiff.Len() ;
if( dErrLoc > dErrMax)
dErrMax = dErrLoc ;
// aggiorno il vettore dei punti di controllo della nuova curva
vPntCtrl[p] += vDiff ;
}
dErr = dErrMax ;
// aggiorno i punti di controllo della nuova curva
for ( int i = 0 ; i < nDeg + 1 ; ++i)
pNewBez->SetControlPoint( i, vPntCtrl[i]) ;
++c ;
}
// calcolo l'errore di approssimazione sulla curva
CalcBezierApproxError( this, pNewBez, dErr) ;
bOk = dErr < dTol ;
if ( bOk) {
// aggiorno la curva di bezier originale con quella approssimata
Init( nDeg, false) ;
for ( int i = 0 ; i < nDeg + 1 ; ++i) {
SetControlPoint( i, pNewBez->GetControlPoint( i)) ;
SetControlWeight( i, pNewBez->GetControlWeight( i)) ;
}
}
else if ( nDeg < m_nDeg + 4)
goto retry ;
}
return bOk ;
}
//----------------------------------------------------------------------------
bool
CurveBezier::IsALine( void) const
{
Point3d ptStart ; GetStartPoint( ptStart) ;
Point3d ptEnd ; GetEndPoint( ptEnd) ;
for ( int i = 1 ; i < m_nDeg ; ++i) {
Point3d ptCtrl = GetControlPoint( i) ;
DistPointLine dpl( ptCtrl, ptStart, ptEnd) ;
double dDist = 0 ; dpl.GetDist( dDist) ;
if( dDist > EPS_SMALL)
return false ;
}
return true ;
}
//----------------------------------------------------------------------------
PNTVECTOR
CurveBezier::GetAllControlPoints( void) const
{
PNTVECTOR vPntCtrl = m_vPtCtrl ;
return vPntCtrl ;
}
+15 -5
View File
@@ -117,7 +117,7 @@ class CurveBezier : public ICurveBezier, public IGeoObjRW
ICurve* CopyParamRange( double dUStart, double dUEnd) const override ;
bool Invert( void) override ;
bool SimpleOffset( double dDist, int nType = OFF_FILLET) override
{ return false ; } // l'offset di crvBezier non è crvBezier tranne in casi molto particolari
{ return false ; } // l'offset di crvBezier non è crvBezier tranne in casi molto particolari
bool ModifyStart( const Point3d& ptNewStart) override ;
bool ModifyEnd( const Point3d& ptNewEnd) override ;
bool SetExtrusion( const Vector3d& vtExtr) override
@@ -137,7 +137,9 @@ class CurveBezier : public ICurveBezier, public IGeoObjRW
bool Init( int nDeg, bool bIsRational) override ;
bool SetControlPoint( int nInd, const Point3d& ptCtrl) override ;
bool SetControlPoint( int nInd, const Point3d& ptCtrl, double dW) override ;
bool SetControlWeight( int nInd, double dW) override ;
bool FromArc( const ICurveArc& crArc) override ;
bool FromLine( const ICurveLine& crLine) override ;
int GetDegree( void) const override
{ return m_nDeg ; }
bool IsRational( void) const override
@@ -147,11 +149,19 @@ class CurveBezier : public ICurveBezier, public IGeoObjRW
double GetControlWeight( int nInd, bool* pbOk = NULL) const override ;
bool GetControlPolygonLength( double& dLen) const override ;
int GetSingularParam( double& dPar) const override ;
bool MakeRational( void) override ;
bool MakeRationalStandardForm( void) override ;
bool MakeNonRational( double dTol) override ;
bool IsALine( void) const override ;
PNTVECTOR GetAllControlPoints( void) const ; // non aggiunta in interfaccia
public : // IGeoObjRW
int GetNgeId( void) const override ;
bool Save( NgeWriter& ngeOut) const override ;
bool PreSave( GdbGeo& Wrapper) const override { return true ; }
bool PostSave( GdbGeo& Wrapper) const override { return true ; }
bool Load( NgeReader& ngeIn) override ;
bool PostLoad( GdbGeo& Wrapper) override { return true ; }
public :
CurveBezier( void) ;
@@ -165,6 +175,7 @@ class CurveBezier : public ICurveBezier, public IGeoObjRW
bool ApproxWithLines( int nStep, PolyLine& PL) const ;
bool GetApproxLength( double& dLen) const ;
Voronoi* GetVoronoiObject( void) const ;
void ResetVoronoiObject( void) const ;
private :
bool CopyFrom( const CurveBezier& cbSrc) ;
@@ -183,23 +194,22 @@ class CurveBezier : public ICurveBezier, public IGeoObjRW
bool ToPowerBase( PolynomialPoint3d& pol3P) const ;
bool ToPowerBase( PolynomialPoint3d& pol3Num, Polynomial& polDen) const ;
bool CalcVoronoiObject( void) const ;
void ResetVoronoiObject( void) const ;
private :
enum Status { ERR = 0, OK = 1, TO_VERIFY = 2} ;
static const int MAXDEG = 11 ;
static const int MAXDEG = 21 ;
private :
ObjGraphicsMgr m_OGrMgr ; // gestore grafica dell'oggetto
Status m_nStatus ; // stato
int m_nDeg ; // grado
bool m_bRat ; // flag di razionale/polinomiale
mutable double m_dParSing ; // eventuale parametro della singolarità (-1=no, -2=da calcolare)
mutable double m_dParSing ; // eventuale parametro della singolarità (-1=no, -2=da calcolare)
PNTVECTOR m_vPtCtrl ; // vettore dei punti di controllo
DBLVECTOR m_vWeCtrl ; // vettore dei pesi di controllo
Vector3d m_VtExtr ; // vettore estrusione (normalmente coincide con m_VtN)
double m_dThick ; // spessore
int m_nTempProp[2] ; // vettore proprietà temporanee
int m_nTempProp[2] ; // vettore proprietà temporanee
double m_dTempParam[2] ; // vettore parametri temporanei
mutable Voronoi* m_pVoronoiObj ; // Voronoi
} ;
+14 -11
View File
@@ -16,8 +16,8 @@
#include "CurveComposite.h"
#include "CalcDerivate.h"
#include "BiArcs.h"
#include "DistPointLine.h"
#include "RemoveCurveDefects.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGkCurveByApprox.h"
#include "/EgtDev/Include/EGkPolyLine.h"
#include "/EgtDev/Include/EGkPolyArc.h"
@@ -439,12 +439,12 @@ CurveByApprox::CalcSplitPoints( double dLinTol, double dAngTolDeg, double dLinFe
m_vSplits.push_back(i) ;
continue ;
}
// verifico linearità del tratto precedente
// verifico linearità del tratto precedente
bool bPrevLin = vtPrev.SqLen() > dSqLinFea &&
( m_vNextDer[i-1] * m_vPrevDer[i]) > dAngTolCos &&
( vtPrev ^ m_vNextDer[i-1]).SqLen() < dSqLinTol &&
( vtPrev ^ m_vPrevDer[i]).SqLen() < dSqLinTol ;
// verifico linearità del tratto successivo
// verifico linearità del tratto successivo
bool bNextLin = vtNext.SqLen() > dSqLinFea &&
( m_vNextDer[i] * m_vPrevDer[i+1]) > dAngTolCos &&
( vtNext ^ m_vNextDer[i]).SqLen() < dSqLinTol &&
@@ -483,7 +483,7 @@ CurveByApprox::BiArcOrSplit( int nLev, PolyLine& PL, double dLinTol, double dAng
PtrOwner<ICurve> pCrv ;
double dMaxDist ;
// se la polilinea ha più di 2 punti
// se la polilinea ha più di 2 punti
if ( PL.GetPointNbr() > 2) {
// calcolo punti e direzioni agli estremi della polilinea usando la curva di Bezier
int nI ;
@@ -501,11 +501,12 @@ CurveByApprox::BiArcOrSplit( int nLev, PolyLine& PL, double dLinTol, double dAng
ptP1 = m_vPnt[nI] ;
m_vPrevDer[nI].ToSpherical( nullptr, nullptr, &dDir1Deg) ;
// costruisco un biarco sulla polilinea (secondo metodo di Z. Sir)
pCrv.Set( GetBiArc( ptP0, dDir0Deg, ptP1, dDir1Deg, PL, dMaxDist)) ;
pCrv.Set( GetBiArc( ptP0, dDir0Deg, ptP1, dDir1Deg, PL, dMaxDist, dLinTol)) ;
// forzo la spezzatura della curva
if ( IsNull( pCrv))
return false ;
dMaxDist = 2 * dLinTol ;
}
// se la polilinea è formata da 2 punti
// se la polilinea è formata da 2 punti
else if ( PL.GetPointNbr() == 2) {
// se molto vicini, esco
double dLen ;
@@ -524,13 +525,15 @@ CurveByApprox::BiArcOrSplit( int nLev, PolyLine& PL, double dLinTol, double dAng
// se raggiunto il massimo livello di recursione, forzo l'accettazione del biarco
if ( nLev >= MAX_LEV) {
if ( IsNull( pCrv))
return false ;
dMaxDist = 0 ;
// segnalo situazione per debug
if ( GetEGkDebugLev() >= 5)
LOG_DBG_ERR( GetEGkLogger(), "ERROR : Exceeded recursions")
}
// se lunghezza abbastanza picccola, forzo l'accettazione della curva
// se lunghezza abbastanza piccola, forzo l'accettazione della curva
double dLen ;
if ( PL.GetApproxLength( dLen) && dLen < 10 * EPS_SMALL)
dMaxDist = 0 ;
@@ -561,7 +564,7 @@ CurveByApprox::BiArcOrSplit( int nLev, PolyLine& PL, double dLinTol, double dAng
return false ;
}
// spezzo l'intervallo in due parti a metà
// spezzo l'intervallo in due parti a metà
double dParStart, dParEnd ;
if ( ! PL.GetFirstU( dParStart) || ! PL.GetLastU( dParEnd))
return false ;
@@ -569,9 +572,9 @@ CurveByApprox::BiArcOrSplit( int nLev, PolyLine& PL, double dLinTol, double dAng
PolyLine PL2 ;
if ( ! PL.Split( dParMid, PL2))
return false ;
// prima metà
// prima metà
if ( ! BiArcOrSplit( nLev + 1, PL, dLinTol, dAngTolDeg, PA))
return false ;
// seconda metà
// seconda metà
return BiArcOrSplit( nLev + 1, PL2, dLinTol, dAngTolDeg, PA) ;
}
+269 -181
View File
File diff suppressed because it is too large Load Diff
+8 -4
View File
@@ -150,7 +150,7 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW
bool IsParamAtJoint( double dU) const override ;
ICurve* RemoveFirstOrLastCurve( bool bLast = true) override ;
bool ChangeStartPoint( double dU) override ;
bool AddPoint( const Point3d& ptStart) override ;
bool AddPoint( const Point3d& ptStart) override ; // funzione per aggiungere il ptStart prima di usare la funzione AddLine
bool AddLine( const Point3d& ptNew, bool bEndOrStart = true) override ;
bool AddLineTg( double dLen, bool bEndOrStart = true) override ;
bool AddArc2P( const Point3d& ptOther, const Point3d& ptNew, bool bEndOrStart = true) override ;
@@ -177,11 +177,15 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW
bool GetCurveTempProp( int nCrv, int& nProp, int nPropInd = 0) const override ;
bool SetCurveTempParam( int nCrv, double dParam, int nParamInd = 0) override ;
bool GetCurveTempParam( int nCrv, double& dParam, int nParamInd = 0) const override ;
bool GetOnlyPoint( Point3d& ptStart) const override ;
public : // IGeoObjRW
int GetNgeId( void) const override ;
bool Save( NgeWriter& ngeOut) const override ;
bool PreSave( GdbGeo& Wrapper) const override { return true ; }
bool PostSave( GdbGeo& Wrapper) const override { return true ; }
bool Load( NgeReader& ngeIn) override ;
bool PostLoad( GdbGeo& Wrapper) override { return true ; }
public :
CurveComposite( void) ;
@@ -195,6 +199,7 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW
bool RelocateFrom( CurveComposite& ccSrc) ;
bool GetApproxLength( double& dLen) const ;
Voronoi* GetVoronoiObject( void) const ;
void ResetVoronoiObject( void) const ;
private :
bool CopyFrom( const CurveComposite& ccSrc) ;
@@ -206,10 +211,9 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW
bool SimpleOffsetXY( double dDist, int nType = OFF_FILLET) ;
bool IsOneCircle( Point3d& ptCen, Vector3d& vtN, double& dRad, bool& bCCW) const ;
bool CalcVoronoiObject( void) const ;
void ResetVoronoiObject( void) const ;
private :
enum Status { ERR = 0, OK = 1, TO_VERIFY = 2} ;
enum Status { ERR = 0, OK = 1, TO_VERIFY = 2, IS_A_POINT = 3} ;
private :
typedef std::deque<ICurve*> PCRVSMPL_DEQUE ;
@@ -222,7 +226,7 @@ class CurveComposite : public ICurveComposite, public IGeoObjRW
Vector3d m_VtExtr ; // vettore estrusione (normalmente coincide con m_VtN)
double m_dThick ; // spessore
Point3d m_ptStart ; // punto iniziale per composita vuota per Add di linee o archi
int m_nTempProp[2] ; // vettore proprietà temporanee
int m_nTempProp[2] ; // vettore proprietà temporanee
double m_dTempParam[2] ; // vettore parametri temporanei
mutable Voronoi* m_pVoronoiObj ; // Voronoi
mutable PCSD_CONST_ITER m_Iter ; // iteratore
+38 -28
View File
@@ -14,11 +14,11 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "CurveLine.h"
#include "DistPointLine.h"
#include "GeoObjFactory.h"
#include "NgeWriter.h"
#include "NgeReader.h"
#include "Voronoi.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGkStringUtils3d.h"
#include "/EgtDev/Include/EgtNumUtils.h"
#include "/EgtDev/Include/EgtPointerOwner.h"
@@ -162,7 +162,7 @@ CurveLine::Dump( string& sOut, bool bMM, const char* szNewLine) const
// dati generali di una curva
if ( ! CurveDump( *this, sOut, bMM, szNewLine))
return false ;
// parametri : sono già compresi nei dati generali (PS e PE)
// parametri : sono già compresi nei dati generali (PS e PE)
return true ;
}
@@ -223,7 +223,7 @@ CurveLine::GetLocalBBox( BBox3d& b3Loc, int nFlag) const
return false ;
// assegno il box in locale
b3Loc.Set( m_PtStart, m_PtEnd) ;
// se c'è estrusione, devo tenerne conto
// se c'è estrusione, devo tenerne conto
if ( ! m_VtExtr.IsSmall() && abs( m_dThick) > EPS_SMALL) {
Point3d ptMinExtr = b3Loc.GetMin() + m_VtExtr * m_dThick ;
Point3d ptMaxExtr = b3Loc.GetMax() + m_VtExtr * m_dThick ;
@@ -241,7 +241,7 @@ CurveLine::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
// verifico lo stato
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// porto gli estremi nel riferimento passato
@@ -251,7 +251,7 @@ CurveLine::GetBBox( const Frame3d& frRef, BBox3d& b3Ref, int nFlag) const
ptFrEnd.ToGlob( frRef) ;
// assegno il box nel riferimento
b3Ref.Set( ptFrStart, ptFrEnd) ;
// se c'è estrusione, devo tenerne conto
// se c'è estrusione, devo tenerne conto
if ( ! m_VtExtr.IsSmall() && abs( m_dThick) > EPS_SMALL) {
Vector3d vtFrExtr = m_VtExtr ;
vtFrExtr.ToGlob( frRef) ;
@@ -390,7 +390,7 @@ CurveLine::GetLength( double& dLen) const
if ( m_nStatus != OK)
return false ;
// la lunghezza è la distanza tra gli estremi
// la lunghezza è la distanza tra gli estremi
dLen = Dist( m_PtStart, m_PtEnd) ;
return ( dLen > EPS_SMALL) ;
@@ -416,7 +416,7 @@ CurveLine::GetLengthAtParam( double dU, double& dLen) const
return true ;
}
// la lunghezza totale è la distanza tra gli estremi
// la lunghezza totale è la distanza tra gli estremi
double dTotLen = Dist( m_PtStart, m_PtEnd) ;
// fine
@@ -448,7 +448,7 @@ CurveLine::GetParamAtLength( double dLen, double& dU) const
return true ;
}
// la lunghezza totale è la distanza tra gli estremi
// la lunghezza totale è la distanza tra gli estremi
double dTotLen = Dist( m_PtStart, m_PtEnd) ;
// se dopo fine, errore
@@ -811,8 +811,10 @@ CurveLine::Translate( const Vector3d& vtMove)
if ( m_nStatus != OK)
return false ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// traslo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->Translate( vtMove) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -830,12 +832,14 @@ CurveLine::Rotate( const Point3d& ptAx, const Vector3d& vtAx, double dCosAng, do
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità dell'asse di rotazione
// verifico validità dell'asse di rotazione
if ( vtAx.IsSmall())
return false ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// ruoto Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->Rotate( ptAx, vtAx, dCosAng, dSinAng) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -894,7 +898,7 @@ CurveLine::Mirror( const Point3d& ptOn, const Vector3d& vtNorm)
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità del piano di specchiatura
// verifico validità del piano di specchiatura
if ( vtNorm.IsSmall())
return false ;
@@ -919,7 +923,7 @@ CurveLine::Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d& v
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità dei parametri
// verifico validità dei parametri
if ( vtNorm.IsSmall() || vtDir.IsSmall())
return false ;
@@ -949,16 +953,18 @@ CurveLine::ToGlob( const Frame3d& frRef)
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// se frame identità, non devo fare alcunché
// se frame identità, non devo fare alcunché
if ( IsGlobFrame( frRef))
return true ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->ToGlob( frRef) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -973,16 +979,18 @@ CurveLine::ToLoc( const Frame3d& frRef)
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità del frame
// verifico validità del frame
if ( frRef.GetType() == Frame3d::ERR)
return false ;
// se frame identità, non devo fare alcunché
// se frame identità, non devo fare alcunché
if ( IsGlobFrame( frRef))
return true ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->ToLoc( frRef) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -997,16 +1005,18 @@ CurveLine::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
// la curva deve essere validata
if ( m_nStatus != OK)
return false ;
// verifico validità dei frame
// verifico validità dei frame
if ( frOri.GetType() == Frame3d::ERR || frDest.GetType() == Frame3d::ERR)
return false ;
// se i due riferimenti coincidono, non devo fare alcunché
// se i due riferimenti coincidono, non devo fare alcunché
if ( AreSameFrame( frOri, frDest))
return true ;
// imposto ricalcolo di Voronoi
ResetVoronoiObject() ;
// trasformo Voronoi
if ( m_pVoronoiObj != nullptr)
m_pVoronoiObj->LocToLoc( frOri, frDest) ;
// imposto ricalcolo della grafica
m_OGrMgr.Reset() ;
@@ -1065,7 +1075,7 @@ CurveLine::GetVoronoiObject() const
if ( m_nStatus != OK)
return nullptr ;
// se non è stato calcolato, lo calcolo
// se non è stato calcolato, lo calcolo
if ( m_pVoronoiObj == nullptr)
CalcVoronoiObject() ;
+6 -3
View File
@@ -146,7 +146,10 @@ class CurveLine : public ICurveLine, public IGeoObjRW
public : // IGeoObjRW
int GetNgeId( void) const override ;
bool Save( NgeWriter& ngeOut) const override ;
bool PreSave( GdbGeo& Wrapper) const override { return true ; }
bool PostSave( GdbGeo& Wrapper) const override { return true ; }
bool Load( NgeReader& ngeIn) override ;
bool PostLoad( GdbGeo& Wrapper) override { return true ; }
public :
CurveLine( void) ;
@@ -158,12 +161,12 @@ class CurveLine : public ICurveLine, public IGeoObjRW
LOG_ERROR( GetEGkLogger(), "CurveLine : copy error")
return *this ; }
Voronoi* GetVoronoiObject( void) const ;
void ResetVoronoiObject( void) const ;
private :
bool CopyFrom( const CurveLine& clSrc) ;
bool Validate( void) ;
bool CalcVoronoiObject( void) const ;
void ResetVoronoiObject( void) const ;
bool CalcVoronoiObject( void) const ;
private :
enum Status { ERR = 0, OK = 1, TO_VERIFY = 2} ;
@@ -175,7 +178,7 @@ class CurveLine : public ICurveLine, public IGeoObjRW
Point3d m_PtEnd ; // punto finale
Vector3d m_VtExtr ; // vettore estrusione
double m_dThick ; // spessore
int m_nTempProp[2] ; // vettore proprietà temporanee
int m_nTempProp[2] ; // vettore proprietà temporanee
double m_dTempParam[2] ; // vettore parametri temporanei
mutable Voronoi* m_pVoronoiObj ; // Voronoi
} ;
+3 -4
View File
@@ -1,7 +1,7 @@
//----------------------------------------------------------------------------
// EgalTech 2020-2022
// EgalTech 2020-2024
//----------------------------------------------------------------------------
// File : DistLineLine.h Data : 12.08.22 Versione : 2.4h1
// File : DistLineLine.cpp Data : 10.05.24 Versione : 2.6e3
// Contenuto : Implementazione della classe distanza fra elementi lineari.
//
//
@@ -12,11 +12,10 @@
//----------------------------------------------------------------------------
#include "stdafx.h"
#include "DistLineLine.h"
#include "/EgtDev/Include/EGkDistLineLine.h"
#include "/EgtDev/Include/EgtNumUtils.h"
#include "/EgtDev/Include/EGkGeoCollection.h"
#include "/EgtDev/Include/EGkGeoConst.h"
#include <algorithm>
using namespace std ;
-53
View File
@@ -1,53 +0,0 @@
//----------------------------------------------------------------------------
// EgalTech 2020-2020
//----------------------------------------------------------------------------
// File : DistLineLine.h Data : 06.11.20 Versione : 2.2k1
// Contenuto : Dichiarazione della classe distanza fra elementi lineari.
//
//
//
// Modifiche : 06.11.20 LM Creazione modulo.
//
//
//----------------------------------------------------------------------------
#pragma once
#include "/EgtDev/Include/EGkVector3d.h"
#include "/EgtDev/Include/EGkPoint3d.h"
//----------------------------------------------------------------------------
class DistLineLine
{
public :
DistLineLine( const Point3d& ptSt1, const Point3d& ptEn1,
const Point3d& ptSt2, const Point3d& ptEn2,
bool bIsSegment1 = true, bool bIsSegment2 = true) ;
DistLineLine( const Point3d& ptSt1, const Vector3d& vtD1, double dLen1,
const Point3d& ptSt2, const Vector3d& vtD2, double dLen2,
bool bIsSegment1 = true, bool bIsSegment2 = true) ;
public :
bool GetSqDist( double& dSqDist) const ;
bool GetDist( double& dDist) const ;
bool IsEpsilon( double dTol) const
{ double dSqDist ; return ( GetSqDist( dSqDist) && ( dSqDist < SQ_EPS_ZERO || dSqDist < dTol * dTol)) ; }
bool IsSmall( void) const
{ return IsEpsilon( EPS_SMALL) ; }
bool IsZero( void) const
{ return IsEpsilon( EPS_ZERO) ; }
bool GetMinDistPoints( Point3d& ptMinDist1, Point3d& ptMinDist2) const ;
bool GetPositionsAtMinDistPoints( double& dPos1, double& dPos2) const ;
private :
void Calculate( const Point3d& ptSt1, const Vector3d& vtD1, double dLen1,
const Point3d& ptSt2, const Vector3d& vtD2, double dLen2,
bool bIsSegment1, bool bIsSegment2) ;
private:
double m_dSqDist ;
mutable double m_dDist ;
double m_dPos1 ;
double m_dPos2 ;
Point3d m_ptMinDist1 ;
Point3d m_ptMinDist2 ;
} ;
+2 -2
View File
@@ -14,9 +14,9 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "DllMain.h"
#include "DistPointCrvAux.h"
#include "DistPointLine.h"
#include "GeoConst.h"
#include "DistPointCrvAux.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
//----------------------------------------------------------------------------
+2 -2
View File
@@ -50,7 +50,7 @@ DistPointCrvComposite::DistPointCrvComposite( const Point3d& ptP, const ICurveCo
}
// altrimenti, per curve successive
else {
// verifico se la distanza minima dal box è superiore al minimo già trovato
// verifico se la distanza minima dal box è superiore al minimo già trovato
BBox3d b3B ;
if ( pCrvSmpl->GetLocalBBox( b3B) &&
b3B.SqDistFromPoint( ptP) <= m_dDist * m_dDist) {
@@ -105,7 +105,7 @@ DistPointCrvComposite::DistPointCrvComposite( const Point3d& ptP, const ICurveCo
++ i ;
}
}
// con minima distanza più bassa
// con minima distanza più bassa
else if ( dCurrDist < m_dDist) {
// aggiorno i minimi
m_dDist = dCurrDist ;
+20 -7
View File
@@ -13,10 +13,10 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "DistPointLine.h"
#include "DistPointArc.h"
#include "DistPointCrvBezier.h"
#include "DistPointCrvComposite.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGkDistPointCurve.h"
@@ -47,6 +47,8 @@ DistPointCurve::DistPointCurve( const Point3d& ptP, const ICurve& Curve, bool bI
case CRV_COMPO :
CrvCompositeCalculate( ptP, Curve) ;
break ;
default :
break ;
}
// salvo il punto
m_ptP = ptP ;
@@ -150,7 +152,7 @@ DistPointCurve::GetMinDistPoint( double dNearParam, Point3d& ptMinDist, int& nFl
}
}
// cerco punto discreto più vicino (anche estremi di zone continue)
// cerco punto discreto più vicino (anche estremi di zone continue)
double dParam ;
for ( int i = 0 ; i < (int) m_Info.size() ; ++ i) {
if ( i == 0 ||
@@ -195,7 +197,7 @@ DistPointCurve::GetParamAtMinDistPoint( double dNearParam, double& dParam, int&
}
}
// cerco punto discreto più vicino (anche estremi di zone continue)
// cerco punto discreto più vicino (anche estremi di zone continue)
for ( int i = 0 ; i < (int) m_Info.size() ; ++ i) {
if ( i == 0 ||
abs( m_Info[i].dPar - dNearParam) < abs( dParam - dNearParam)) {
@@ -230,9 +232,20 @@ DistPointCurve::GetSideAtMinDistPoint( int nInd, const Vector3d& vtN, int& nSide
Vector3d vtTg = 0.5 * ( vtPreTg + vtPostTg) ;
// se tangenti opposte, si deve ricalcolare spostandosi un poco
if ( ! vtTg.Normalize()) {
double dDeltaU = 1000 * EPS_PARAM ;
if ( ! m_pCurve->GetPointTang( m_Info[nInd].dPar - dDeltaU, ICurve::FROM_MINUS, ptQ, vtPreTg) ||
! m_pCurve->GetPointTang( m_Info[nInd].dPar + dDeltaU, ICurve::FROM_PLUS, ptQ, vtPostTg))
double dDeltaU = 1000 * EPS_PARAM ;
double dParPre = m_Info[nInd].dPar - dDeltaU ;
double dParPost = m_Info[nInd].dPar + dDeltaU ;
// verifico se il parametro deve essere modificato per adattarsi a curva chiusa
if ( m_pCurve->IsClosed()) {
double dParS, dParE ;
m_pCurve->GetDomain( dParS, dParE) ;
if ( dParPre < dParS)
dParPre = dParE - dDeltaU ;
if ( dParPost > dParE)
dParPost = dParS + dDeltaU ;
}
if ( ! m_pCurve->GetPointTang( dParPre, ICurve::FROM_MINUS, ptQ, vtPreTg) ||
! m_pCurve->GetPointTang( dParPost, ICurve::FROM_PLUS, ptQ, vtPostTg))
return false ;
vtTg = 0.5 * ( vtPreTg + vtPostTg) ;
if ( ! vtTg.Normalize( EPS_ZERO))
@@ -262,7 +275,7 @@ DistPointCurve::GetSideAtMinDistPoint( double dNearParam, const Vector3d& vtN, i
if ( m_dDist < 0 || m_Info.empty())
return false ;
// cerco punto discreto più vicino (anche estremi di zone continue)
// cerco punto discreto più vicino (anche estremi di zone continue)
int nInd ;
double dParam ;
for ( int i = 0 ; i < (int) m_Info.size() ; ++ i) {
+4 -4
View File
@@ -1,19 +1,19 @@
//----------------------------------------------------------------------------
// EgalTech 2013-2013
// EgalTech 2013-2024
//----------------------------------------------------------------------------
// File : DistPointLine.cpp Data : 17.12.13 Versione : 1.4l1
// File : DistPointLine.cpp Data : 20.05.24 Versione : 2.6e5
// Contenuto : Implementazione della classe distanza punto da linea/segmento.
//
//
//
// Modifiche : 17.12.13 DS Creazione modulo.
//
// 20.05.24 DS Reso pubblico in Include.
//
//----------------------------------------------------------------------------
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "DistPointLine.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
//----------------------------------------------------------------------------
-58
View File
@@ -1,58 +0,0 @@
//----------------------------------------------------------------------------
// EgalTech 2013-2014
//----------------------------------------------------------------------------
// File : DistPointLine.h Data : 02.01.14 Versione : 1.5a1
// Contenuto : Dichiarazione della classe distanza punto da linea/segmento.
//
//
//
// Modifiche : 30.12.12 DS Creazione modulo.
//
//
//----------------------------------------------------------------------------
#pragma once
#include "/EgtDev/Include/EGkPoint3d.h"
#include "/EgtDev/Include/EGkCurveLine.h"
//-----------------------------------------------------------------------------
class DistPointLine
{
friend class DistPointCurve ;
public :
DistPointLine( const Point3d& ptP,
const ICurveLine& crvLine, bool bIsSegment = true) ;
DistPointLine( const Point3d& ptP,
const Point3d& ptIni, const Point3d& ptFin, bool bIsSegment = true) ;
DistPointLine( const Point3d& ptP,
const Point3d& ptIni, const Vector3d& vtDir, double dLen, bool bIsSegment = true) ;
public :
bool GetSqDist( double& dSqDist) const ;
bool GetDist( double& dDist) const ;
bool IsEpsilon( double dTol) const
{ double dSqDist ; return ( GetSqDist( dSqDist) && ( dSqDist < SQ_EPS_ZERO || dSqDist < dTol * dTol)) ; }
bool IsSmall( void) const
{ return IsEpsilon( EPS_SMALL) ; }
bool IsZero( void) const
{ return IsEpsilon( EPS_ZERO) ; }
int GetNbrMinDist( void) const
{ return (( m_dSqDist < 0) ? 0 : 1) ; }
bool GetMinDistPoint( Point3d& ptMinDist) const ;
bool GetParamAtMinDistPoint( double& dParam) const ;
private :
DistPointLine( void) ;
void Calculate( const Point3d& ptP,
const Point3d& ptIni, const Vector3d& vtDir, double dLen, bool bIsSegment) ;
private :
double m_dSqDist ;
mutable double m_dDist ;
double m_dParam ;
Point3d m_ptMinDist ;
} ;
+156
View File
@@ -0,0 +1,156 @@
//----------------------------------------------------------------------------
// EgalTech 2018-2020
//----------------------------------------------------------------------------
// File : DistPointSurfTm.cpp Data : 19.12.20 Versione : 2.2l3
// Contenuto : Implementazione della classe distanza Punto da Trimesh.
//
//
//
// Modifiche : 07.12.18 LM Creazione modulo.
//
//
//----------------------------------------------------------------------------
#include "stdafx.h"
#include "SurfFlatRegion.h"
#include "/EgtDev/Include/EGkDistPointCurve.h"
#include "/EgtDev/Include/EGkDistPointSurfFr.h"
using namespace std ;
//----------------------------------------------------------------------------
DistPointSurfFr::DistPointSurfFr( const Point3d& ptP, const ISurfFlatRegion& frSurf)
: m_dDist( -1)
{
// FlatRegion non valida
if ( &frSurf == nullptr || ! frSurf.IsValid())
return ;
// Calcolo la distanza
Calculate( ptP, frSurf) ;
}
//----------------------------------------------------------------------------
void
DistPointSurfFr::Calculate( const Point3d& ptP, const ISurfFlatRegion& frSurf)
{
// Inizializzo distanza non calcolata
m_dDist = -1 ;
// Converto regione in classe base
const SurfFlatRegion* pSfr = GetBasicSurfFlatRegion( &frSurf) ;
if ( pSfr == nullptr)
return ;
// ciclo sulle parti della regione
for ( int nC = 0 ; nC < pSfr->GetChunkCount() ; nC ++) {
// ciclo sui loop della parte di regione
for ( int nL = 0 ; nL < pSfr->GetLoopCount( nC) ; nL ++) {
PtrOwner<ICurve> pLoop( pSfr->GetLoop( nC, nL)) ;
if ( IsNull( pLoop)) {
m_dDist = -1 ;
return ;
}
DistPointCurve DPL( ptP, *pLoop) ;
double dDist ;
if ( DPL.GetDist( dDist) && ( m_dDist < -EPS_SMALL || dDist < m_dDist)) {
m_dDist = dDist ;
int nFlag ;
m_nMinChunk = nC ;
m_nMinLoop = nL ;
DPL.GetParamAtMinDistPoint( 0, m_dMinPar, nFlag) ;
DPL.GetMinDistPoint( 0, m_ptMinDistPoint, nFlag) ;
DPL.GetSideAtMinDistPoint( 0, pSfr->GetNormVersor(), m_nSide) ;
}
}
}
// se trovata, aggiorno minima distanza sul piano
if ( m_dDist > - EPS_SMALL) {
Point3d ptOn = ptP - ( ptP - pSfr->GetPlanePoint()) * pSfr->GetNormVersor() * pSfr->GetNormVersor() ;
m_dDistOnPlane = min( Dist( ptOn, m_ptMinDistPoint), m_dDist) ;
}
}
//----------------------------------------------------------------------------
bool
DistPointSurfFr::GetDist( double& dDist) const
{
if ( m_dDist < 0)
return false ;
dDist = m_dDist ;
return true ;
}
//----------------------------------------------------------------------------
bool
DistPointSurfFr::GetDistOnRegionPlane( double& dDist) const
{
if ( m_dDist < 0)
return false ;
dDist = m_dDistOnPlane ;
return true ;
}
//----------------------------------------------------------------------------
bool
DistPointSurfFr::GetPointAtMinDist( Point3d& ptMinDist) const
{
if ( m_dDist < 0)
return false ;
ptMinDist = m_ptMinDistPoint ;
return true ;
}
//----------------------------------------------------------------------------
bool
DistPointSurfFr::GetParamAtMinDist( int& nMinChunk, int& nMinLoop, double& dMinPar) const
{
if ( m_dDist < 0)
return false ;
nMinChunk = m_nMinChunk ;
nMinLoop = m_nMinLoop ;
dMinPar = m_dMinPar ;
return true ;
}
//----------------------------------------------------------------------------
bool
DistPointSurfFr::GetSideAtMinDist( int& nSide) const
{
if ( m_dDist < 0)
return false ;
nSide = m_nSide ;
return true ;
}
//----------------------------------------------------------------------------
bool
IsPointInsideSurfFr( const Point3d& ptP, const ISurfFlatRegion* pSfr, double dMinDist, bool& bInside, int& nChunk)
{
// default non include
bInside = false ;
nChunk = -1 ;
// verifica regione
if ( pSfr == nullptr || ! pSfr->IsValid())
return false ;
// verifico se la proiezione del punto sul piano della regione sta nel suo box
Point3d ptOn = ptP - ( ptP - pSfr->GetPlanePoint()) * pSfr->GetNormVersor() * pSfr->GetNormVersor() ;
BBox3d b3Box ;
pSfr->GetLocalBBox( b3Box) ;
b3Box.Expand( dMinDist) ;
if ( ! b3Box.Encloses( ptOn))
return true ;
// determino dove sta il punto
DistPointSurfFr DPR( ptP, *pSfr) ;
double dDist ; int nMinCh, nMinL; double dMinPar ; int nSide ;
if ( DPR.GetDistOnRegionPlane( dDist) && DPR.GetParamAtMinDist( nMinCh, nMinL, dMinPar) && DPR.GetSideAtMinDist( nSide)) {
if ( abs( dMinDist) < EPS_SMALL)
bInside = ( nSide != PRS_OUT) ;
else if ( dMinDist < 0)
bInside = ( nSide == PRS_IN && dDist > abs( dMinDist) - EPS_SMALL) ;
else
bInside = ( nSide != PRS_OUT || dDist < dMinDist + EPS_SMALL) ;
if ( bInside)
nChunk = nMinCh ;
}
return true ;
}
+117 -30
View File
@@ -15,15 +15,16 @@
#include "SurfTriMesh.h"
#include "/EgtDev/Include/EGkDistPointTria.h"
#include "/EgtDev/Include/EGkDistPointSurfTm.h"
#include "/EgtDev/Include/EGkIntersLineTria.h"
using namespace std ;
//----------------------------------------------------------------------------
// Calcola la differenza fra i bounding-box A e B.
// L'insieme differenza non è un bounding-box, ma è esprimibile come unione di al più sei bounding-box.
// L'insieme differenza non è un bounding-box, ma è esprimibile come unione di al più sei bounding-box.
// Se l'insieme differenza fra i box non ha misura nulla viene restituito true, false altrimenti.
// I casi in cui non vengono trovati box di misura positiva sono quelli in cui o il box A è contenuto
// nel box B; uno di questi si verifica se il box A è vuoto.
// I casi in cui non vengono trovati box di misura positiva sono quelli in cui o il box A è contenuto
// nel box B; uno di questi si verifica se il box A è vuoto.
// Nel vettore vBoxDiff vengono restituiti i box la cui unione costituisce la differenza fra A e B.
static bool
BoundingBoxDifference( const BBox3d& boxA, const BBox3d& boxB, BOXVECTOR& vBoxDiff)
@@ -33,7 +34,7 @@ BoundingBoxDifference( const BBox3d& boxA, const BBox3d& boxB, BOXVECTOR& vBoxDi
// Se box A vuoto, risultato vuoto
if ( boxA.IsEmpty())
return false ;
// Se box B vuoto o i box non si intersecano, risultato è ancora A
// Se box B vuoto o i box non si intersecano, risultato è ancora A
BBox3d boxInt ;
if ( boxB.IsSmall() || ! boxA.FindIntersection( boxB, boxInt)) {
vBoxDiff.emplace_back( boxA) ;
@@ -93,6 +94,10 @@ DistPointSurfTm::Calculate( const Point3d& ptP, const ISurfTriMesh& tmSurf)
{
// Inizializzo distanza non calcolata
m_dDist = - 1. ;
// Vettore di indici dei triangoli più vicini inizialmente vuoto
m_vnMinDistTriaIndex.clear() ;
// Controllo se la superficie è chiusa
m_bIsSurfClosed = tmSurf.IsClosed() ;
// Lavoro con l'oggetto superficie trimesh di base
const SurfTriMesh* pStm = GetBasicSurfTriMesh( &tmSurf) ;
@@ -104,8 +109,8 @@ DistPointSurfTm::Calculate( const Point3d& ptP, const ISurfTriMesh& tmSurf)
if ( b3Stm.IsEmpty())
return ;
// Cerco triangoli in box centrati sul punto dato di ampiezza crescente ed escludendo le parti già verificate.
// Termino quando non trovo più triangoli che possano soddisfare la richiesta.
// Cerco triangoli in box centrati sul punto dato di ampiezza crescente ed escludendo le parti già verificate.
// Termino quando non trovo più triangoli che possano soddisfare la richiesta.
Point3d ptMin, ptMax ; b3Stm.GetMinMax( ptMin, ptMax) ;
double dDeltaLen = max( min( min( b3Stm.GetDimX(), b3Stm.GetDimY()), b3Stm.GetDimZ()) / 40., 20.) ;
double dBoxHalfLenX = max( max( ptMin.x - ptP.x, ptP.x - ptMax.x), 0.) + dDeltaLen ;
@@ -115,14 +120,17 @@ DistPointSurfTm::Calculate( const Point3d& ptP, const ISurfTriMesh& tmSurf)
BBox3d boxPPrev( ptP) ;
BBox3d boxP( ptP, dBoxHalfLenX, dBoxHalfLenY, dBoxHalfLenZ) ;
// Variabili distanza minima, indice del triangolo di distanza minima, punto di distanza minima
double dMinSqDist = DBL_MAX ;
double dMinDist = DBL_MAX ;
int nMinDistTriaIndex = SVT_NULL ;
Point3d ptMinDistPoint ;
// Finché non si verifica la condizione di terminazione ingrandisco il box.
// Finché non si verifica la condizione di terminazione ingrandisco il box.
pStm->ResetTempInts() ;
bool bContinue = true ;
// creazione del vettore dei triangoli più vicini a ptP
vector<pair<int, Triangle3d>> vTria ; // <indice triangolo, Triangolo>
while ( bContinue) {
// Calcolo il box differenza con il precedente per non esplorare parti già considerate
// Calcolo il box differenza con il precedente per non esplorare parti già considerate
BOXVECTOR vBox ;
BoundingBoxDifference( boxP, boxPPrev, vBox) ;
// Ciclo sui box differenza
@@ -130,12 +138,12 @@ DistPointSurfTm::Calculate( const Point3d& ptP, const ISurfTriMesh& tmSurf)
for ( const auto& b3Box : vBox) {
// interseco il box con quello della superficie e ne verifico la distanza minima dal punto
BBox3d b3Int ;
if ( ! b3Box.FindIntersection( b3Stm, b3Int) || b3Int.SqDistFromPoint( ptP) > dMinSqDist)
if ( ! b3Box.FindIntersection( b3Stm, b3Int) || b3Int.DistFromPoint( ptP) > dMinDist)
continue ;
// ricerca sui triangoli nel box
bCollide = true ;
INTVECTOR vnIds ;
if ( pStm->GetAllTriaOverlapBox( b3Int, vnIds)) {
INTVECTOR vnIds ;
if ( pStm->GetAllTriaOverlapBox( b3Int, vnIds)) {
// Ciclo sui triangoli del sotto-box corrente
for ( auto nT : vnIds) {
int nTriaTemp ;
@@ -143,19 +151,30 @@ DistPointSurfTm::Calculate( const Point3d& ptP, const ISurfTriMesh& tmSurf)
if ( pStm->GetTempInt( nT, nTriaTemp) && nTriaTemp == 0 && pStm->GetTriangle( nT, trCurTria)) {
pStm->SetTempInt( nT, 1) ;
DistPointTriangle distPT( ptP, trCurTria) ;
double dCurSqDist ;
// Se la distanza del triangolo è valida e minore di quella attuale aggiorno
if ( distPT.GetSqDist( dCurSqDist) && dCurSqDist < dMinSqDist) {
dMinSqDist = dCurSqDist ;
nMinDistTriaIndex = nT ;
distPT.GetMinDistPoint( ptMinDistPoint) ;
double dCurrDist ;
// Se la distanza del triangolo è valida e minore di quella attuale aggiorno
if ( distPT.GetDist( dCurrDist)) {
// se distanze uguali...
if ( abs( dCurrDist - dMinDist) < EPS_SMALL)
// aggiungo il triangolo
vTria.emplace_back( make_pair( nT, trCurTria)) ;
// se minore...
else if ( dCurrDist < dMinDist) {
// pulisco il vettore
vTria.clear() ;
dMinDist = dCurrDist ;
nMinDistTriaIndex = nT ;
distPT.GetMinDistPoint( ptMinDistPoint) ;
// aggiungo il triangolo
vTria.emplace_back( make_pair( nT, trCurTria)) ;
}
}
}
}
}
}
// Se si verifica la condizione di terminazione arresto il ciclo altrimenti aggiorno i box
if ( ! bCollide || dMinSqDist < EPS_SMALL * EPS_SMALL)
if ( ! bCollide || dMinDist < EPS_SMALL)
bContinue = false ;
else {
boxPPrev = boxP ;
@@ -163,15 +182,71 @@ DistPointSurfTm::Calculate( const Point3d& ptP, const ISurfTriMesh& tmSurf)
}
}
if ( nMinDistTriaIndex != SVT_NULL) {
m_dDist = sqrt( max( dMinSqDist, 0.)) ;
// se non ho trovato nessun triangolo, esco
if ( nMinDistTriaIndex == SVT_NULL)
return ;
// Inizializzo il vettore dei triangoli a minima distanza
for ( auto& Tria : vTria)
m_vnMinDistTriaIndex.emplace_back( Tria.first) ;
// salvo la distanza minima
m_dDist = dMinDist ;
// salvo il punto a distanza minima
m_ptMinDistPoint = ptMinDistPoint ;
// se il punto è sulla TriMesh...
if ( m_dDist < EPS_SMALL) {
m_nMinDistTriaIndex = nMinDistTriaIndex ;
m_ptMinDistPoint = ptMinDistPoint ;
Triangle3d trMinDistTria ;
pStm->GetTriangle( m_nMinDistTriaIndex, trMinDistTria) ;
trMinDistTria.Validate() ;
m_bIsInside = ( ( ptP - m_ptMinDistPoint) * trMinDistTria.GetN() < - EPS_SMALL) && pStm->IsClosed() ;
m_bIsInside = false ;
return ;
}
// se ho un solo triangolo, allora deduco le informazioni da lui
else if ( int( vTria.size()) == 1) {
m_nMinDistTriaIndex = vTria.back().first ;
m_bIsInside = ( ( ptP - m_ptMinDistPoint) * vTria.back().second.GetN() < - EPS_SMALL) ;
return ;
}
// controllo se tutti i triangoli a minima distanza forniscono la stessa informazione
// ( il punto potrebbe essere esterno a tutti, interno a tutti o indefinito )
bool bInside = false ;
bool bOutside = false ;
for ( int i = 0 ; i < int( vTria.size()) ; ++ i) { // scorro i triangoli a minima distanza
if ( ( ptP - vTria[i].second.GetP( 0)) * vTria[i].second.GetN() < - EPS_SMALL)
bInside = true ;
else
bOutside = true ;
}
// inizializzo le variabili membro
m_nMinDistTriaIndex = nMinDistTriaIndex ;
m_bIsInside = false ;
// se le informazioni non sono coerenti, allora :
// 1) calcolo i centroidi dei triangoli in questione
// 2) ottengo il punto medio di questi centroidi
// 3) controllo quale triangolo interseca il segmento che parte da ptP e arriva a tale punto
// 4) userò questo triangolo per classificare ptP
if ( bOutside == bInside) {
// calcolo il baricentro complessivo
Point3d ptBar_tot ;
for ( auto& Tria : vTria)
ptBar_tot += Tria.second.GetCentroid() ;
ptBar_tot /= int( vTria.size()) ;
// per ogni triangolo, cerco quello che interseca il segmento
for ( auto& Tria : vTria) {
Point3d ptInters1, ptInters2 ;
int nType = IntersLineTria( ptP, ptBar_tot, Tria.second, ptInters1, ptInters2) ;
if ( nType == ILTT_IN) { // se intersezione ho finito
DistPointTriangle( ptP, Tria.second).GetMinDistPoint( m_ptMinDistPoint) ;
m_bIsInside = ( ( ptP - m_ptMinDistPoint) * Tria.second.GetN() < - EPS_SMALL) ;
m_nMinDistTriaIndex = Tria.first ;
break ;
}
}
}
else // se informazioni coerenti
m_bIsInside = bInside ;
}
//----------------------------------------------------------------------------
@@ -210,6 +285,18 @@ DistPointSurfTm::GetMinDistTriaIndex( int& nMinDistIndex) const
return true ;
}
//----------------------------------------------------------------------------
bool
DistPointSurfTm::GetMinDistTriaIndices( INTVECTOR& vMinDistTriaIndex) const
{
// Distanza non valida
if ( m_dDist < - EPS_ZERO)
return false ;
// Distanza valida
vMinDistTriaIndex = m_vnMinDistTriaIndex ;
return true ;
}
//----------------------------------------------------------------------------
int
GetSurfTmNearestVertex( const Point3d& ptP, const ISurfTriMesh& tmSurf)
@@ -224,8 +311,8 @@ GetSurfTmNearestVertex( const Point3d& ptP, const ISurfTriMesh& tmSurf)
if ( b3Stm.IsEmpty())
return SVT_NULL ;
// Cerco triangoli in box centrati sul punto dato di ampiezza crescente ed escludendo le parti già verificate.
// Termino quando non trovo più triangoli che possano soddisfare la richiesta.
// Cerco triangoli in box centrati sul punto dato di ampiezza crescente ed escludendo le parti già verificate.
// Termino quando non trovo più triangoli che possano soddisfare la richiesta.
Point3d ptMin, ptMax ; b3Stm.GetMinMax( ptMin, ptMax) ;
double dDeltaLen = max( min( min( b3Stm.GetDimX(), b3Stm.GetDimY()), b3Stm.GetDimZ()) / 40., 20.) ;
double dBoxHalfLenX = max( max( ptMin.x - ptP.x, ptP.x - ptMax.x), 0.) + dDeltaLen ;
@@ -237,11 +324,11 @@ GetSurfTmNearestVertex( const Point3d& ptP, const ISurfTriMesh& tmSurf)
// Variabili distanza minima
int nVert = SVT_NULL ;
double dMinSqDist = DBL_MAX ;
// Finché non si verifica la condizione di terminazione ingrandisco il box.
// Finché non si verifica la condizione di terminazione ingrandisco il box.
pStm->ResetTempInts() ;
bool bContinue = true ;
while ( bContinue) {
// Calcolo il box differenza con il precedente per non esplorare parti già considerate
// Calcolo il box differenza con il precedente per non esplorare parti già considerate
BOXVECTOR vBox ;
BoundingBoxDifference( boxP, boxPPrev, vBox) ;
// Ciclo sui box differenza
+1 -1
View File
@@ -14,7 +14,7 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "ProjPlane.h"
#include "DistPointLine.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGkDistPointTria.h"
+10 -1
View File
@@ -159,11 +159,20 @@ InitFontManager( const string& sNfeFontDir, const string& sDefaultFont)
{
// recupero il font manager
FontManager& fntMgr = FontManager::GetFontManager() ;
// lo inizializzo
fntMgr.Init( sNfeFontDir, sDefaultFont) ;
}
//-----------------------------------------------------------------------------
void
SetDefaultFont( const string& sDefaultFont)
{
// recupero il font manager
FontManager& fntMgr = FontManager::GetFontManager() ;
// imposto il dato
fntMgr.SetDefaultFont( sDefaultFont) ;
}
//-----------------------------------------------------------------------------
const string&
GetNfeFontDir( void)
BIN
View File
Binary file not shown.
+22 -8
View File
@@ -22,7 +22,7 @@
<ProjectGuid>{9A98A202-2853-454A-84CA-DCD1714176C9}</ProjectGuid>
<RootNamespace>EgtGeomKernel</RootNamespace>
<Keyword>MFCDLLProj</Keyword>
<WindowsTargetPlatformVersion>10.0.20348.0</WindowsTargetPlatformVersion>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
@@ -30,7 +30,7 @@
<UseDebugLibraries>true</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>false</UseOfMfc>
<PlatformToolset>v141_xp</PlatformToolset>
<PlatformToolset>v143</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
@@ -46,7 +46,7 @@
<WholeProgramOptimization>false</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
<UseOfMfc>false</UseOfMfc>
<PlatformToolset>v141_xp</PlatformToolset>
<PlatformToolset>v143</PlatformToolset>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
@@ -117,6 +117,7 @@
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<EnablePREfast>false</EnablePREfast>
<LanguageStandard>stdcpp17</LanguageStandard>
<AdditionalIncludeDirectories>C:\EgtDev\Extern\abseil\Include</AdditionalIncludeDirectories>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
@@ -281,6 +282,7 @@ copy $(TargetPath) \EgtProg\Dll64</Command>
<ClCompile Include="BBox3d.cpp" />
<ClCompile Include="BiArcs.cpp" />
<ClCompile Include="CalcPocketing.cpp" />
<ClCompile Include="CAvSilhouetteSurfTm.cpp" />
<ClCompile Include="CAvSimpleSurfFrMove.cpp" />
<ClCompile Include="CAvToolSurfTm.cpp" />
<ClCompile Include="CAvToolTriangle.cpp" />
@@ -309,6 +311,7 @@ copy $(TargetPath) \EgtProg\Dll64</Command>
<ClCompile Include="CurveByApprox.cpp" />
<ClCompile Include="CurveByInterp.cpp" />
<ClCompile Include="CurveCompositeOffset.cpp" />
<ClCompile Include="DistPointSurfFr.cpp" />
<ClCompile Include="IntersCurveSurfTm.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</ExcludedFromBuild>
@@ -317,20 +320,34 @@ copy $(TargetPath) \EgtProg\Dll64</Command>
</ClCompile>
<ClCompile Include="IntersLineVolZmap.cpp" />
<ClCompile Include="IntersPlaneVolZmap.cpp" />
<ClCompile Include="IntersLineSurfBez.cpp" />
<ClCompile Include="SurfTriMeshOffset.cpp" />
<ClCompile Include="VolZmapOffset.cpp" />
<ClCompile Include="PolygonElevation.cpp" />
<ClCompile Include="RotationMinimizeFrame.cpp" />
<ClCompile Include="Quaternion.cpp" />
<ClCompile Include="RotationMinimizingFrame.cpp" />
<ClCompile Include="RotationXplaneFrame.cpp" />
<ClCompile Include="SbzFromCurves.cpp" />
<ClCompile Include="SbzStandard.cpp" />
<ClCompile Include="Voronoi.cpp" />
<ClInclude Include="..\Include\EGkCDeClosedSurfTmClosedSurfTm.h" />
<ClInclude Include="..\Include\EGkCDeConeFrustumClosedSurfTm.h" />
<ClInclude Include="..\Include\EGkCDeConvexTorusClosedSurfTm.h" />
<ClInclude Include="..\Include\EGkCDeRectPrismoidClosedSurfTm.h" />
<ClInclude Include="..\Include\EGkDistLineLine.h" />
<ClInclude Include="..\Include\EGkDistPointLine.h" />
<ClInclude Include="..\Include\EGkIntersCurveSurfTm.h" />
<ClInclude Include="..\Include\EGkIntersLineBox.h" />
<ClInclude Include="..\Include\EGkIntersLineVolZmap.h" />
<ClInclude Include="..\Include\EGkIntersPlaneBox.h" />
<ClInclude Include="..\Include\EGkIntersPlaneVolZmap.h" />
<ClInclude Include="..\Include\EGkPolygonElevation.h" />
<ClInclude Include="..\Include\EGkQuaternion.h" />
<ClInclude Include="..\Include\EGkRotationMinimizingFrame.h" />
<ClInclude Include="..\Include\EGkRotationXplaneFrame.h" />
<ClInclude Include="..\Include\EGkSubtractProjectedFacesOnStmFace.h" />
<ClInclude Include="..\Include\EGkSurfTriMeshAux.h" />
<ClInclude Include="CAvSilhouetteSurfTm.h" />
<ClInclude Include="CDeBoxTria.h" />
<ClInclude Include="CDeCapsTria.h" />
<ClInclude Include="CDeConeFrustumTria.h" />
@@ -416,7 +433,7 @@ copy $(TargetPath) \EgtProg\Dll64</Command>
<ClCompile Include="OffsetCurveOnX.cpp" />
<ClCompile Include="Polygon3d.cpp" />
<ClCompile Include="AdjustLoops.cpp" />
<ClCompile Include="ProjectCurveSurfTm.cpp" />
<ClCompile Include="ProjectCurveSurf.cpp" />
<ClCompile Include="RemoveCurveDefects.cpp" />
<ClCompile Include="SelfIntersCurve.cpp" />
<ClCompile Include="SfrCreate.cpp" />
@@ -461,7 +478,6 @@ copy $(TargetPath) \EgtProg\Dll64</Command>
<ClCompile Include="VolZmapGraphics.cpp" />
<ClCompile Include="VolZmapVolume.cpp" />
<ClCompile Include="VolZmap.cpp" />
<ClInclude Include="RotationMinimizeFrame.h" />
<ClInclude Include="Voronoi.h" />
</ItemGroup>
<ItemGroup>
@@ -589,12 +605,10 @@ copy $(TargetPath) \EgtProg\Dll64</Command>
<ClInclude Include="CAvSimpleSurfFrMove.h" />
<ClInclude Include="CAvToolSurfTm.h" />
<ClInclude Include="CreateCurveAux.h" />
<ClInclude Include="DistLineLine.h" />
<ClInclude Include="DistPointArc.h" />
<ClInclude Include="DistPointCrvAux.h" />
<ClInclude Include="DistPointCrvBezier.h" />
<ClInclude Include="DistPointCrvComposite.h" />
<ClInclude Include="DistPointLine.h" />
<ClInclude Include="DllMain.h" />
<ClInclude Include="earcut.hpp" />
<ClInclude Include="ExtDimension.h" />
+48 -9
View File
@@ -276,6 +276,9 @@
<ClCompile Include="IntersLineSurfTm.cpp">
<Filter>File di origine\GeoInters</Filter>
</ClCompile>
<ClCompile Include="IntersLineSurfBez.cpp">
<Filter>File di origine\GeoInters</Filter>
</ClCompile>
<ClCompile Include="CircleCenTgCurve.cpp">
<Filter>File di origine\GeoCreate</Filter>
</ClCompile>
@@ -483,7 +486,7 @@
<ClCompile Include="IntersLineCaps.cpp">
<Filter>File di origine\GeoInters</Filter>
</ClCompile>
<ClCompile Include="ProjectCurveSurfTm.cpp">
<ClCompile Include="ProjectCurveSurf.cpp">
<Filter>File di origine\GeoProject</Filter>
</ClCompile>
<ClCompile Include="SubtractProjectedFacesOnStmFace.cpp">
@@ -522,9 +525,33 @@
<ClCompile Include="IntersPlaneVolZmap.cpp">
<Filter>File di origine\GeoInters</Filter>
</ClCompile>
<ClCompile Include="RotationMinimizeFrame.cpp">
<ClCompile Include="SbzStandard.cpp">
<Filter>File di origine\GeoCreate</Filter>
</ClCompile>
<ClCompile Include="RotationMinimizingFrame.cpp">
<Filter>File di origine\Base</Filter>
</ClCompile>
<ClCompile Include="RotationXplaneFrame.cpp">
<Filter>File di origine\Base</Filter>
</ClCompile>
<ClCompile Include="Quaternion.cpp">
<Filter>File di origine\Base</Filter>
</ClCompile>
<ClCompile Include="CAvSilhouetteSurfTm.cpp">
<Filter>File di origine\GeoCollisionAvoid</Filter>
</ClCompile>
<ClCompile Include="SbzFromCurves.cpp">
<Filter>File di origine\GeoCreate</Filter>
</ClCompile>
<ClCompile Include="DistPointSurfFr.cpp">
<Filter>File di origine\GeoDist</Filter>
</ClCompile>
<ClCompile Include="VolZmapOffset.cpp">
<Filter>File di origine\Geo</Filter>
</ClCompile>
<ClCompile Include="SurfTriMeshOffset.cpp">
<Filter>File di origine\GeoOffset</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="stdafx.h">
@@ -581,9 +608,6 @@
<ClInclude Include="DistPointArc.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="DistPointLine.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="DistPointCrvBezier.h">
<Filter>File di intestazione</Filter>
</ClInclude>
@@ -1106,9 +1130,6 @@
<ClInclude Include="..\Include\EGkIntersPlaneBox.h">
<Filter>File di intestazione\Include</Filter>
</ClInclude>
<ClInclude Include="DistLineLine.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="CDeUtility.h">
<Filter>File di intestazione</Filter>
</ClInclude>
@@ -1193,9 +1214,27 @@
<ClInclude Include="..\Include\EGkIntersLineVolZmap.h">
<Filter>File di intestazione\Include</Filter>
</ClInclude>
<ClInclude Include="RotationMinimizeFrame.h">
<ClInclude Include="..\Include\EGkRotationMinimizingFrame.h">
<Filter>File di intestazione\Include</Filter>
</ClInclude>
<ClInclude Include="..\Include\EGkRotationXplaneFrame.h">
<Filter>File di intestazione\Include</Filter>
</ClInclude>
<ClInclude Include="..\Include\EGkQuaternion.h">
<Filter>File di intestazione\Include</Filter>
</ClInclude>
<ClInclude Include="..\Include\EGkDistLineLine.h">
<Filter>File di intestazione\Include</Filter>
</ClInclude>
<ClInclude Include="..\Include\EGkDistPointLine.h">
<Filter>File di intestazione\Include</Filter>
</ClInclude>
<ClInclude Include="CAvSilhouetteSurfTm.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="..\Include\EGkSurfTriMeshAux.h">
<Filter>File di intestazione\Include</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="EgtGeomKernel.rc">
+140 -47
View File
@@ -21,12 +21,14 @@
#include "FontManager.h"
#include "FontAux.h"
#include "CurveArc.h"
#include "IntersLineLine.h"
#include "/EgtDev/Include/EGkStringUtils3d.h"
#include "/EgtDev/Include/EGkExtText.h"
#include "/EgtDev/Include/EGkUiUnits.h"
#include "/EgtDev/Include/EgtNumUtils.h"
#include "/EgtDev/Include/EGkCurve.h"
#include <new>
#include <algorithm>
using namespace std ;
@@ -63,7 +65,7 @@ ExtDimension::~ExtDimension( void)
//----------------------------------------------------------------------------
bool
ExtDimension::SetStyle( double dExtLineLen, double dArrowLen, double dTextDist, bool bLenIsMM,
int nDecDigit, const string& sFont, double dTextHeight)
int nDecDigit, const string& sFont, double dTextHeight)
{
m_dExtLineLen = max( dExtLineLen, MIN_EXTLINELEN) ;
m_dArrowLen = max( dArrowLen, MIN_ARROWLEN) ;
@@ -200,7 +202,7 @@ ExtDimension::SetDiametral( const Point3d& ptCen, const Point3d& ptPos,
//----------------------------------------------------------------------------
bool
ExtDimension::SetAngular( const Point3d& ptP1, const Point3d& ptV, const Point3d& ptP2, const Point3d& ptPos,
ExtDimension::SetAngular( const Point3d& ptV, const Point3d& ptP1, const Point3d& ptP2, const Point3d& ptPos,
const Vector3d& vtN, const string& sText)
{
// dichiaro quota non ancora determinata
@@ -209,17 +211,16 @@ ExtDimension::SetAngular( const Point3d& ptP1, const Point3d& ptV, const Point3d
m_vtN = vtN ;
if ( ! m_vtN.Normalize())
return false ;
// porto i punti nel piano definito da P1 e N
m_ptP1 = ptP1 ;
m_ptP2 = ptP2 - ( ptP2 - m_ptP1) * m_vtN * m_vtN ;
m_ptP6 = ptV - ( ptV - m_ptP1) * m_vtN * m_vtN ;
m_ptPos = ptPos - ( ptPos - m_ptP1) * m_vtN * m_vtN ;
// verifico che i punti di misura non siano coincidenti
if ( AreSamePointApprox( m_ptP1, m_ptP2) || AreSamePointApprox( m_ptP1, m_ptP6) || AreSamePointApprox( m_ptP2, m_ptP5))
return false ;
// direzione di riferimento ( nel piano perpendicolare a vtN)
// porto i punti e le direzioni nel piano definito da V e N
m_ptP6 = ptV ;
m_ptPos = ptPos - ( ptPos - m_ptP6) * m_vtN * m_vtN ;
m_vtDir = m_ptPos - m_ptP6 ;
double dLenDir = m_vtDir.Len() ;
Vector3d vtLine1 = OrthoCompo( ptP1 - m_ptP6, m_vtN) ;
Vector3d vtLine2 = OrthoCompo( ptP2 - m_ptP6, m_vtN) ;
// verifico che i punti di misura non siano coincidenti
if ( ! vtLine1.Normalize() || ! vtLine2.Normalize() || dLenDir < EPS_SMALL)
return false ;
// controllo se è testo o se è la misura
double dFactor ;
@@ -243,20 +244,12 @@ ExtDimension::SetAngular( const Point3d& ptP1, const Point3d& ptV, const Point3d
m_vtDir = m_ptPos - m_ptP6 ;
dLenDir = m_vtDir.Len() ;
}
// calcolo le direzioni su cui giacciono i due lati dell'angolo
Vector3d vtLine1 = m_ptP1 - m_ptP6 ;
Vector3d vtLine2 = m_ptP2 - m_ptP6 ;
double dLen1 = vtLine1.Len() ;
double dLen2 = vtLine2.Len() ;
if ( ! vtLine1.Normalize() || ! vtLine2.Normalize())
return false ;
// segnalo se i punti che definiscono i lati sono più lontani dal centro di ptPos
bool bPt1Close = ( dLenDir < dLen1 ? true : false) ;
bool bPt2Close = ( dLenDir < dLen2 ? true : false) ;
m_ptP5 = m_ptP1 + ( dLenDir - dLen1) * vtLine1 ;
Point3d ptP5_bis = m_ptP2 + ( dLenDir - dLen2) * vtLine2 ;
m_ptP3 = m_ptP5 + ( bPt1Close ? - vtLine1 : vtLine1) * m_dExtLineLen ;
m_ptP4 = ptP5_bis + ( bPt2Close ? - vtLine2 : vtLine2) * m_dExtLineLen ;
// assegno gli altri punti notevoli della quotatura
m_ptP1 = m_ptP6 ;
m_ptP2 = m_ptP6 ;
m_ptP5 = m_ptP6 + vtLine1 * dLenDir ;
m_ptP3 = m_ptP6 + vtLine1 * ( dLenDir + m_dExtLineLen) ;
m_ptP4 = m_ptP6 + vtLine2 * ( dLenDir + m_dExtLineLen) ;
// assegnazione del testo
m_sText = sText ;
@@ -266,7 +259,99 @@ ExtDimension::SetAngular( const Point3d& ptP1, const Point3d& ptV, const Point3d
m_bToCalc = true ;
m_OGrMgr.Reset() ;
return true;
return true ;
}
//----------------------------------------------------------------------------
bool
ExtDimension::SetAngularEx( const Point3d& ptV1, const Point3d& ptP1,
const Point3d& ptV2, const Point3d& ptP2, const Point3d& ptPos,
const Vector3d& vtN, const string& sText)
{
// dichiaro quota non ancora determinata
m_nType = DT_NONE ;
// verifico la definizione del versore normale
m_vtN = vtN ;
if ( ! m_vtN.Normalize())
return false ;
// calcolo l'intersezione tra le due linee
CurveLine Line1 ;
if ( ! Line1.Set( ptV1, ptP1) || ! Line1.SetExtrusion( m_vtN))
return false ;
CurveLine Line2 ;
if ( ! Line2.Set( ptV2, ptP2) || ! Line2.SetExtrusion( m_vtN))
return false ;
IntersLineLine IntLL( Line1, Line2, false) ;
IntCrvCrvInfo Info ;
if ( ! IntLL.GetIntCrvCrvInfo( Info) || Info.bOverlap)
return false ;
Point3d ptV = Media( Info.IciA[0].ptI, Info.IciB[0].ptI) ;
// porto i punti e le direzioni nel piano definito da V1 e N
m_ptP6 = ptV ;
m_ptPos = ptPos - ( ptPos - m_ptP6) * m_vtN * m_vtN ;
m_vtDir = m_ptPos - m_ptP6 ;
double dLenDir = m_vtDir.Len() ;
Vector3d vtLine1 = OrthoCompo( ptP1 - m_ptP6, m_vtN) ;
Vector3d vtLine2 = OrthoCompo( ptP2 - m_ptP6, m_vtN) ;
// verifico che i punti di misura non siano coincidenti
if ( ! vtLine1.Normalize() || ! vtLine2.Normalize() || dLenDir < EPS_SMALL)
return false ;
// controllo se è testo o se è la misura
double dFactor ;
if ( m_sCalcText.find( IS_MEASURE) != string::npos) {
m_sCalcText = "300.00" ;
double dHalfDist = GetTextHalfDist( m_ptPos) ;
dFactor = 2.5 * dHalfDist ;
m_sCalcText = "" ;
}
else {
double dHalfDist = GetTextHalfDist( m_ptPos) ;
dFactor = 2.5 * dHalfDist ;
}
// allungo m_vtDir se è troppo vicino al centro
if ( m_vtDir.Len() < dFactor) {
Vector3d vtDir_n = m_vtDir ;
if ( ! vtDir_n.Normalize())
return false ;
m_ptPos = m_ptP6 + dFactor * vtDir_n ;
// ricalcolo m_vtDir
m_vtDir = m_ptPos - m_ptP6 ;
dLenDir = m_vtDir.Len() ;
}
// assegno gli altri punti notevoli della quotatura
// se i ptV concidono con l'intersezione tra le linee le sposto leggermente verso l'altro punto di quel lato
Point3d ptV1New = ptV1 ;
Point3d ptV2New = ptV2 ;
if ( AreSamePointApprox( ptV1, ptV)) {
Vector3d vtDir1 ; Line1.GetStartDir( vtDir1) ;
double dLen ; Line1.GetLength( dLen) ;
dLen = max( min( 1., dLen/ 10), 0.01) ;
ptV1New = ptV1 + vtDir1 * dLen ;
}
if ( AreSamePointApprox( ptV2, ptV)) {
Vector3d vtDir2 ; Line2.GetStartDir( vtDir2) ;
double dLen ; Line2.GetLength( dLen) ;
dLen = max( min( 1., dLen/ 10), 0.01) ;
ptV2New = ptV2 + vtDir2 * dLen ;
}
m_ptP1 = ptV1New - ( ptV1New - m_ptP6) * m_vtN * m_vtN ;
m_ptP2 = ptV2New - ( ptV2New - m_ptP6) * m_vtN * m_vtN ;
m_ptP5 = m_ptP6 + vtLine1 * dLenDir ;
double dLen1 = Dist( m_ptP6, m_ptP1) ;
m_ptP3 = m_ptP6 + vtLine1 * ( dLenDir + m_dExtLineLen * ( dLen1 < dLenDir ? 1 : -1)) ;
double dLen2 = Dist( m_ptP6, m_ptP2) ;
m_ptP4 = m_ptP6 + vtLine2 * ( dLenDir + m_dExtLineLen * ( dLen2 < dLenDir ? 1 : -1)) ;
// assegnazione del testo
m_sText = sText ;
// assegno il tipo
m_nType = DT_ANGULAR ;
// imposto da calcolare
m_bToCalc = true ;
m_OGrMgr.Reset() ;
return true ;
}
//----------------------------------------------------------------------------
@@ -1012,6 +1097,7 @@ ExtDimension::Update( void) const
if ( ! GetTextMyBBox( b3Text) && ! b3Text.IsEmpty())
return false ;
double dHeight = b3Text.GetMax().y - b3Text.GetMin().y ;
double dLength = b3Text.GetMax().x - b3Text.GetMin().x ;
Vector3d vtPerpDir = m_ptPos - m_ptP6 ;
if ( ! vtPerpDir.Normalize())
return false ;
@@ -1020,11 +1106,11 @@ ExtDimension::Update( void) const
if ( ! frRef.Set( m_ptP6, m_vtN))
return false ;
double dAngDeg = 0 ;
if ( ! m_vtDir.GetAngle( frRef.VersX(), dAngDeg) || ! vtPerpDir.Rotate( m_vtN, ( dAngDeg < 90 ? 90 : -90)))
if ( ! m_vtDir.GetAngle( frRef.VersX(), dAngDeg) || ! vtPerpDir.Rotate( m_vtN, ( dAngDeg < 90 ? 90 : -90)))
return false ;
m_ptCalcPos = m_ptCalcPos + 0.6 * dHeight * vtPerpDir ;
// semidistanza di interruzione
double dHalfDist = GetTextHalfDist( m_ptCalcPos) ;
double dHalfDist = GetTextHalfDist( m_ptCalcPos, false) ;
// lunghezza della linea di misura
double dLen = Dist( m_ptP1, m_ptP2) ;
// determino come orientare le frecce e dove mettere il testo
@@ -1049,7 +1135,16 @@ ExtDimension::Update( void) const
Vector3d vtRad = m_ptPos - m_ptP5 ;
if ( ! vtRad.Normalize())
return false ;
m_ptCalcPos = m_ptPos + vtRad * ( dHalfDist + 2 * m_dArrowLen) ;
m_ptCalcPos = m_ptPos + vtRad * ( 2 * m_dArrowLen + m_dTextDist) ;
const double COMP_LIM = 0.1 ; // circa 5.7deg
if ( vtRad.x > COMP_LIM)
m_ptCalcPos += dLength / 2 * X_AX ;
else if ( vtRad.x < -COMP_LIM)
m_ptCalcPos -= dLength / 2 * X_AX ;
if ( vtRad.y > COMP_LIM)
m_ptCalcPos += dHeight / 2 * Y_AX ;
else if ( vtRad.y < -COMP_LIM)
m_ptCalcPos -= dHeight / 2 * Y_AX ;
}
// dichiaro ricalcolo eseguito
m_bToCalc = false ;
@@ -1058,8 +1153,8 @@ ExtDimension::Update( void) const
case DT_ANGULAR : {
// angolo
double dAngDeg, dAngDeg1, dAngDeg2 = 0 ;
Vector3d vtLine1 = m_ptP1 - m_ptP6 ;
Vector3d vtLine2 = m_ptP2 - m_ptP6 ;
Vector3d vtLine1 = m_ptP3 - m_ptP6 ;
Vector3d vtLine2 = m_ptP4 - m_ptP6 ;
Vector3d vtLine3 = m_ptPos - m_ptP6 ;
// calcolo gli angoli tra m_ptPos e i due punti che identificano i lati dell'angolo
// per capire se sto calcolando l'angolo interno o esterno
@@ -1074,10 +1169,9 @@ ExtDimension::Update( void) const
ReplaceString( m_sCalcText, IS_MEASURE, sAngDeg + "°") ;
}
// calcolo ptP5_bis
double dLen2 = vtLine2.Len() ;
if ( ! vtLine2.Normalize())
return false ;
Point3d ptP5_bis = m_ptP2 + ( m_vtDir.Len() - dLen2) * vtLine2 ;
Point3d ptP5_bis = m_ptP6 + m_vtDir.Len() * vtLine2 ;
// calcolo l'arco su cui metterò la misura
PtrOwner<CurveArc> pCrvPos( CreateBasicCurveArc()) ;
if ( IsNull( pCrvPos) || ! pCrvPos->Set3P( ptP5_bis, m_ptPos, m_ptP5, false))
@@ -1288,15 +1382,12 @@ ExtDimension::ApproxWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST&
if ( IsNull( pCrvPos))
return false ;
// calcolo ptP5_bis
Vector3d vtLine2 = m_ptP2 - m_ptP6 ;
double dLen2 = vtLine2.Len() ;
Vector3d vtLine2 = m_ptP4 - m_ptP6 ;
if ( ! vtLine2.Normalize())
return false ;
Point3d ptP5_bis = m_ptP2 + ( m_vtDir.Len() - dLen2) * vtLine2 ;
Point3d ptP5_bis = m_ptP6 + m_vtDir.Len() * vtLine2 ;
// approssimerò l'arco con una polyline
PolyLine plApprox ;
double dLinTol = 0.01 ;
double dAngTolDeg = 0.01 ;
// se non ho testo
if ( IsEmptyOrSpaces( m_sCalcText) || ! m_bCalcTextOn) {
if ( ! pCrvPos->SetC2PN( m_ptP6, ptP5_bis, m_ptP5, m_vtN) || ! pCrvPos->ApproxWithLines( dLinTol, dAngTolDeg, ICurve::APL_STD, plApprox))
@@ -1337,7 +1428,7 @@ ExtDimension::ApproxWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST&
dFactor = 0 ;
}
lstPL.emplace_back() ;
Vector3d vtLine1 = m_ptP1 - m_ptP6 ;
Vector3d vtLine1 = m_ptP3 - m_ptP6 ;
if ( ! vtLine1.Normalize())
return false ;
GetArrowHead( m_ptP5, ( m_bCalcArrowIn ? vtEndDir : - vtEndDir) + vtLine1 * dFactor, lstPL.back()) ;
@@ -1356,23 +1447,25 @@ ExtDimension::ApproxWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST&
//----------------------------------------------------------------------------
double
ExtDimension::GetTextHalfDist( const Point3d& ptText) const
ExtDimension::GetTextHalfDist( const Point3d& ptText, bool bUseRot) const
{
// semi distanza di interruzione
double dHalfDist = m_dTextHeight / 2 + m_dTextDist ;
// recupero il box di ingombro del testo
BBox3d b3Text ;
Vector3d vtDir = m_vtDir ;
if ( m_nType == DT_ANGULAR)
vtDir.Normalize() ;
if ( GetTextMyBBox( ptText, b3Text) && ! b3Text.IsEmpty()) {
double dHalfL = ( b3Text.GetMax().x - b3Text.GetMin().x) / 2 ;
double dHalfH = ( b3Text.GetMax().y - b3Text.GetMin().y) / 2 ;
dHalfDist = sqrt( dHalfL * dHalfL + dHalfH * dHalfH) ;
if ( abs( vtDir.x) > EPS_ZERO)
dHalfDist = min( dHalfDist, dHalfL / abs( vtDir.x)) ;
if ( abs( vtDir.y) > EPS_ZERO)
dHalfDist = min( dHalfDist, dHalfH / abs( vtDir.y)) ;
if ( bUseRot) {
Vector3d vtDir = m_vtDir ;
vtDir.Normalize() ;
double dCoeff = ( dHalfH > 1 ? dHalfL / dHalfH : 0) ;
if ( abs( vtDir.x) > dCoeff * abs( vtDir.y))
dHalfDist = min( dHalfDist, dHalfL / abs( vtDir.x)) ;
else
dHalfDist = min( dHalfDist, dHalfH / abs( vtDir.y)) ;
}
dHalfDist += m_dTextDist ;
}
return dHalfDist ;
+10 -4
View File
@@ -28,7 +28,7 @@ class ExtDimension : public IExtDimension, public IGeoObjRW
ExtDimension* Clone( void) const override ;
GeoObjType GetType( void) const override ;
bool IsValid( void) const override
{ return ( m_nType != DT_NONE) ; }
{ return ( m_nType != DT_NONE) ; }
const std::string& GetTitle( void) const override ;
bool Dump( std::string& sOut, bool bMM = true, const char* szNewLine = "\n") const override ;
bool GetLocalBBox( BBox3d& b3Loc, int nFlag = BBF_STANDARD) const override ;
@@ -71,8 +71,11 @@ class ExtDimension : public IExtDimension, public IGeoObjRW
const Vector3d& vtN, const std::string& sText) override ;
bool SetDiametral( const Point3d& ptCen, const Point3d& ptPos,
const Vector3d& vtN, const std::string& sText) override ;
bool SetAngular( const Point3d& ptP1, const Point3d& ptV, const Point3d& ptP2, const Point3d& ptPos,
bool SetAngular( const Point3d& ptV, const Point3d& ptP1, const Point3d& ptP2, const Point3d& ptPos,
const Vector3d& vtN, const std::string& sText) override ;
bool SetAngularEx( const Point3d& ptV1, const Point3d& ptP1,
const Point3d& ptV2, const Point3d& ptP2, const Point3d& ptPos,
const Vector3d& vtN, const std::string& sText) override ;
const Vector3d& GetNormVersor( void) const override
{ return m_vtN ; }
const Vector3d& GetDirVersor( void) const override
@@ -105,12 +108,16 @@ class ExtDimension : public IExtDimension, public IGeoObjRW
{ return m_dTextHeight ; }
bool GetMidPoint( Point3d& ptMid) const override ;
bool GetCenterPoint( Point3d& ptCen) const override ;
const std::string& GetSubType( void) const override ;
bool ApproxWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL) const override ;
public : // IGeoObjRW
int GetNgeId( void) const override ;
bool Save( NgeWriter& ngeOut) const override ;
bool PreSave( GdbGeo& Wrapper) const override { return true ; }
bool PostSave( GdbGeo& Wrapper) const override { return true ; }
bool Load( NgeReader& ngeIn) override ;
bool PostLoad( GdbGeo& Wrapper) override { return true ; }
public :
ExtDimension( void) ;
@@ -124,9 +131,8 @@ class ExtDimension : public IExtDimension, public IGeoObjRW
private :
bool CopyFrom( const ExtDimension& gpSrc) ;
const std::string& GetSubType( void) const ;
bool Update( void) const ;
double GetTextHalfDist( const Point3d& ptText) const ;
double GetTextHalfDist( const Point3d& ptText, bool bUseRot = true) const ;
bool GetArrowHead( const Point3d& ptTip, const Vector3d& vtDir, PolyLine& PL) const ;
bool SetCurrFont( FontManager& fntMgr) const ;
bool ApproxTextWithLines( double dLinTol, double dAngTolDeg, POLYLINELIST& lstPL) const ;
+3
View File
@@ -113,7 +113,10 @@ class ExtText : public IExtText, public IGeoObjRW
public : // IGeoObjRW
int GetNgeId( void) const override ;
bool Save( NgeWriter& ngeOut) const override ;
bool PreSave( GdbGeo& Wrapper) const override { return true ; }
bool PostSave( GdbGeo& Wrapper) const override { return true ; }
bool Load( NgeReader& ngeIn) override ;
bool PostLoad( GdbGeo& Wrapper) override { return true ; }
public :
ExtText( void) ;
+62 -13
View File
@@ -18,6 +18,7 @@
#include "/EgtDev/Include/EGkFilletChamfer.h"
#include "/EgtDev/Include/EGkDistPointCurve.h"
#include "/EgtDev/Include/EGkIntersCurves.h"
#include "/EgtDev/Include/EgkOffsetCurve.h"
#include "/EgtDev/Include/EgtPointerOwner.h"
using namespace std ;
@@ -40,13 +41,21 @@ CalcForFillet( const ICurve& cCrv1, const Point3d& ptNear1,
if ( ! dPC1.GetSideAtMinDistPoint( 0, vtNorm, nSide1))
return false ;
double dOffs1 = ( nSide1 == MDS_RIGHT ? dRadius : - dRadius) ;
// calcolo l'offset nel piano locale e dal lato opportuno di una copia della curva 1
// calcolo gli offset nel piano locale e dal lato opportuno di una copia della curva 1
PtrOwner<ICurve> pCopy1( cCrv1.Clone()) ;
if ( IsNull( pCopy1))
return false ;
pCopy1->ToLoc( frIntr) ;
pCopy1->SetExtrusion( Z_AX) ;
if ( ! pCopy1->SimpleOffset( dOffs1, ICurve::OFF_FILLET))
OffsetCurve OffsCrv1 ;
OffsCrv1.Make( pCopy1, dOffs1, ICurve::OFF_FILLET) ;
ICURVEPOVECTOR vOffs1 ;
ICurve* pCrv = OffsCrv1.GetLongerCurve() ;
while ( pCrv != nullptr) {
vOffs1.emplace_back( pCrv) ;
pCrv = OffsCrv1.GetLongerCurve() ;
}
if ( vOffs1.empty())
return false ;
// determino il lato di offset della curva 2
@@ -54,23 +63,50 @@ CalcForFillet( const ICurve& cCrv1, const Point3d& ptNear1,
if ( ! dPC2.GetSideAtMinDistPoint( 0, vtNorm, nSide2))
return false ;
double dOffs2 = ( nSide2 == MDS_RIGHT ? dRadius : - dRadius) ;
// calcolo l'offset nel piano locale e dal lato opportuno di una copia della curva 2
// calcolo gli offset nel piano locale e dal lato opportuno di una copia della curva 2
PtrOwner<ICurve> pCopy2( cCrv2.Clone()) ;
if ( IsNull( pCopy2))
return false ;
pCopy2->ToLoc( frIntr) ;
pCopy2->SetExtrusion( Z_AX) ;
if ( ! pCopy2->SimpleOffset( dOffs2, ICurve::OFF_FILLET))
OffsetCurve OffsCrv2 ;
OffsCrv2.Make( pCopy2, dOffs2, ICurve::OFF_FILLET) ;
ICURVEPOVECTOR vOffs2 ;
pCrv = OffsCrv2.GetLongerCurve() ;
while ( pCrv != nullptr) {
vOffs2.emplace_back( pCrv) ;
pCrv = OffsCrv2.GetLongerCurve() ;
}
if ( vOffs2.empty())
return false ;
// calcolo l'intersezione tra le due curve
Point3d ptInt1, ptInt2 ;
// calcolo le intersezioni tra tutte le curve di offset e seleziono quella più vicina ai punti passati
Point3d ptInt1 = P_INVALID, ptInt2 = P_INVALID ;
Point3d ptNearI = Media( ptNear1, ptNear2) ;
ptNearI.ToLoc( frIntr) ;
IntersCurveCurve intCC( *pCopy1, *pCopy2) ;
if ( ! intCC.GetIntersPointNearTo( 0, ptNearI, ptInt1) ||
! intCC.GetIntersPointNearTo( 1, ptNearI, ptInt2))
return false ;
double dMinDist = INFINITO ;
for ( int i = 0 ; i < int( vOffs1.size()) ; i++) {
for ( int j = 0 ; j < int( vOffs2.size()) ; j ++) {
IntersCurveCurve intCC( *vOffs1[i], *vOffs2[j]) ;
if ( intCC.GetIntersCount() == 0)
continue ;
Point3d ptInt1Curr, ptInt2Curr ;
if ( ! intCC.GetIntersPointNearTo( 0, ptNearI, ptInt1Curr) ||
! intCC.GetIntersPointNearTo( 1, ptNearI, ptInt2Curr))
return false ;
Point3d ptCenCurr = Media( ptInt1Curr, ptInt2Curr) ;
double dDist = Dist( ptNearI, ptCenCurr) ;
if ( dDist < dMinDist - EPS_SMALL) {
dMinDist = dDist ;
ptInt1 = ptInt1Curr ;
ptInt2 = ptInt2Curr ;
}
}
}
// se non sono state trovate intersezioni esco
if ( ! ptInt1.IsValid() || ! ptInt2.IsValid())
return false ;
ptInt1.ToGlob( frIntr) ;
ptInt2.ToGlob( frIntr) ;
ptCen = Media( ptInt1, ptInt2) ;
@@ -105,12 +141,16 @@ CreateFillet( const ICurve& cCrv1, const Point3d& ptNear1,
const ICurve& cCrv2, const Point3d& ptNear2,
const Vector3d& vtNorm, double dRadius, double& dPar1, double& dPar2)
{
// verifico validità parametri ricevuti
// verifico validità parametri ricevuti
if ( &cCrv1 == nullptr || &ptNear1 == nullptr ||
&cCrv2 == nullptr || &ptNear2 == nullptr ||
&vtNorm == nullptr || &dPar1 == nullptr || &dPar2 == nullptr)
return nullptr ;
// verifico il minimo raggio
if ( dRadius < 10 * EPS_SMALL)
return nullptr ;
// eseguo calcoli
Point3d ptCen, ptTg1, ptTg2 ;
int nSide1, nSide2 ;
@@ -119,7 +159,7 @@ CreateFillet( const ICurve& cCrv1, const Point3d& ptNear1,
ptCen, ptTg1, ptTg2, nSide1, nSide2, dSinA, dTgPar1, dTgPar2))
return nullptr ;
// se tangenti parallele al contatto con fillet, ricalcolo con raggio più piccolo
// se tangenti parallele al contatto con fillet, ricalcolo con raggio più piccolo
bool bParallel = ( abs( dSinA) < EPS_SMALL) ;
if ( bParallel) {
Point3d ptQQQ, ptQQ1, ptQQ2 ;
@@ -129,6 +169,11 @@ CreateFillet( const ICurve& cCrv1, const Point3d& ptNear1,
return nullptr ;
}
// verifico dimensione minima
double dLen = Dist( ptTg1, ptTg2) ;
if ( dLen < 2 * EPS_SMALL)
return nullptr ;
// orientamento tra le curve
bool bCCW = ( dSinA > 0) ;
@@ -165,12 +210,16 @@ CreateChamfer( const ICurve& cCrv1, const Point3d& ptNear1,
const ICurve& cCrv2, const Point3d& ptNear2,
const Vector3d& vtNorm, double dDist, double& dPar1, double& dPar2)
{
// verifico validità parametri ricevuti
// verifico validità parametri ricevuti
if ( &cCrv1 == nullptr || &ptNear1 == nullptr ||
&cCrv2 == nullptr || &ptNear2 == nullptr ||
&vtNorm == nullptr || &dPar1 == nullptr || &dPar2 == nullptr)
return nullptr ;
// verifico lo smusso minimo
if ( dDist < 10 * EPS_SMALL)
return nullptr ;
// calcolo un riferimento sul piano perpendicolare alla normale
Frame3d frIntr ;
if ( ! frIntr.Set( ORIG, vtNorm))
+3 -1
View File
@@ -29,6 +29,8 @@ class FontManager
public :
bool Init( const std::string& sNfeFontDir, const std::string& sDefaultFont) ;
bool SetDefaultFont( const std::string& sDefaultFont)
{ m_sDefaultFont = sDefaultFont ; return true ; }
bool SetCurrFont( const std::string& sFont, int nWeight, bool bItalic,
double dHeight, double dRatio, double dAddAdvance) ;
const std::string& GetNfeFontDir( void) const
@@ -54,7 +56,7 @@ class FontManager
OsFont m_OsFont ;
private :
FontManager( void) {}
FontManager( void) : m_bCurrNfeFont( false) {}
FontManager( FontManager const& copy) = delete ;
FontManager& operator=( FontManager const& copy) = delete ;
} ;
+2 -2
View File
@@ -493,7 +493,7 @@ NfeFont::GetTextLines( const string& sText, int nInsPos, PNTVECTOR& vPt, STRVECT
int nLbLen ;
if ( IsLineBreak( vCode, i, nLbLen)) {
// salvo la linea, se contiene qualcosa
if ( vTmpCode.size() > 0) {
if ( ! vTmpCode.empty()) {
string sLine ;
SetCodePoints( vTmpCode, sLine) ;
vLine.push_back( sLine) ;
@@ -523,7 +523,7 @@ NfeFont::GetTextLines( const string& sText, int nInsPos, PNTVECTOR& vPt, STRVECT
dMaxW = vtMove.x ;
}
// salvo eventuale ultima linea
if ( vTmpCode.size() > 0) {
if ( ! vTmpCode.empty()) {
string sLine ;
SetCodePoints( vTmpCode, sLine) ;
vLine.push_back( sLine) ;
+2 -2
View File
@@ -619,7 +619,7 @@ OsFont::GetTextLines( const string& sText, int nInsPos, PNTVECTOR& vPt, STRVECTO
int nLbLen ;
if ( IsLineBreak( vCode, i, nLbLen)) {
// salvo la linea, se contiene qualcosa
if ( vTmpCode.size() > 0) {
if ( ! vTmpCode.empty()) {
string sLine ;
SetCodePoints( vTmpCode, sLine) ;
vLine.push_back( sLine) ;
@@ -646,7 +646,7 @@ OsFont::GetTextLines( const string& sText, int nInsPos, PNTVECTOR& vPt, STRVECTO
dMaxW = vtMove.x ;
}
// salvo eventuale ultima linea
if ( vTmpCode.size() > 0) {
if ( ! vTmpCode.empty()) {
string sLine ;
SetCodePoints( vTmpCode, sLine) ;
vLine.push_back( sLine) ;
+17
View File
@@ -37,6 +37,23 @@ Frame3d::Set( const Point3d& ptOrig, const Vector3d& vtDirX,
! m_vtVersZ.Normalize())
return false ;
// se ci sono errori molto piccoli di ortogonalità, li correggo
double dOrtXZ = m_vtVersX * m_vtVersZ ;
if ( dOrtXZ > EPS_ZERO && dOrtXZ < 10 * EPS_ZERO) {
m_vtVersX = OrthoCompo( m_vtVersX, m_vtVersZ) ;
m_vtVersX.Normalize() ;
}
double dOrtYX = m_vtVersY * m_vtVersX ;
if ( dOrtYX > EPS_ZERO && dOrtYX < 10 * EPS_ZERO) {
m_vtVersY = OrthoCompo( m_vtVersY, m_vtVersX) ;
m_vtVersY.Normalize() ;
}
double dOrtYZ = m_vtVersY * m_vtVersZ ;
if ( dOrtYZ > EPS_ZERO && dOrtYZ < 10 * EPS_ZERO) {
m_vtVersY = OrthoCompo( m_vtVersY, m_vtVersZ) ;
m_vtVersY.Normalize() ;
}
// verifica della ortogonalità dei versori e del senso destrorso
if ( ! Verify())
return false ;
+5 -5
View File
@@ -2267,7 +2267,7 @@ bool
GdbExecutor::SurfTriMeshEnd( const STRVECTOR& vsParams)
{
// nessun parametro
if ( vsParams.size() != 0)
if ( ! vsParams.empty())
return false ;
// recupero la superficie
ISurfTriMesh* pSTM = GetSurfTriMesh( m_pGeoObj) ;
@@ -6632,7 +6632,7 @@ GdbExecutor::ExecuteDeselect( const string& sCmd2, const STRVECTOR& vsParams)
// deselezione di tutto
else if ( sCmd2 == "ALL") {
// nessun parametro
if ( vsParams.size() != 0)
if ( ! vsParams.empty())
return false ;
// cancello selezione oggetti
if ( ! m_pGDB->ClearSelection())
@@ -7773,7 +7773,7 @@ bool
GdbExecutor::ExecuteNew( const string& sCmd2, const STRVECTOR& vsParams)
{
// nessun parametro
if ( vsParams.size() != 0)
if ( ! vsParams.empty())
return false ;
// pulizia e reinizializzazione del DB geometrico
m_pGDB->Clear() ;
@@ -7946,7 +7946,7 @@ GdbExecutor::ExecuteOutTsc( const string& sCmd2, const STRVECTOR& vsParams)
// chiudo il file di uscita Tsc
else if ( sCmd2 == "CLOSE") {
// nessun parametro
if ( vsParams.size() != 0)
if ( ! vsParams.empty())
return false ;
// scrivo terminazioni e chiudo il file
return m_OutTsc.Close() ;
@@ -7969,7 +7969,7 @@ GdbExecutor::ExecuteOutTsc( const string& sCmd2, const STRVECTOR& vsParams)
else if ( sCmd2 == "SETGR") {
Frame3d frF ;
// nessun parametro
if ( vsParams.size() == 0)
if ( vsParams.empty())
frF.Reset() ;
// un parametro ( Id del gruppo)
else if ( vsParams.size() == 1) {
+12 -4
View File
@@ -101,6 +101,10 @@ GdbGeo::Save( int nBaseId, NgeWriter& ngeOut, INTUNORDSET* pSavedIds) const
if ( pGObjRW == nullptr)
return false ;
// eventuali modifiche prima del salvataggio
if ( ! pGObjRW->PreSave( * const_cast<GdbGeo*>( this)))
return false ;
// tipo entità e identificativi
if ( ! ngeOut.WriteKey( pGObjRW->GetNgeId()))
return false ;
@@ -124,7 +128,11 @@ GdbGeo::Save( int nBaseId, NgeWriter& ngeOut, INTUNORDSET* pSavedIds) const
// parametri geometrici
if ( ! ngeOut.WriteKey( NGE_G))
return false ;
return pGObjRW->Save( ngeOut) ;
if ( ! pGObjRW->Save( ngeOut))
return false ;
// eventuali ripristini dopo il salvataggio
return pGObjRW->PostSave( * const_cast<GdbGeo*>( this)) ;
}
//----------------------------------------------------------------------------
@@ -181,7 +189,7 @@ GdbGeo::Load( int nNgeId, NgeReader& ngeIn, int nBaseGdbId, int& nParentId)
// parametri geometrici
IGeoObjRW* pGObjRW = dynamic_cast<IGeoObjRW*>( m_pGeoObj) ;
return ( pGObjRW != nullptr && pGObjRW->Load( ngeIn)) ;
return ( pGObjRW != nullptr && pGObjRW->Load( ngeIn) && pGObjRW->PostLoad( *this)) ;
}
//----------------------------------------------------------------------------
@@ -328,7 +336,7 @@ GdbGeo::Scale( const Frame3d& frRef, double dCoeffX, double dCoeffY, double dCoe
// curva originale
ICurve* pCrv = GetCurve( m_pGeoObj) ;
// trasformo in curva di Bezier (semplice o composta)
ICurve* pCrvNew = ArcToBezierCurve( pCrv) ;
ICurve* pCrvNew = ArcToBezierCurve( GetCurveArc( pCrv)) ;
if ( pCrvNew == nullptr)
return false ;
// assegno alla nuova curva estrusione e spessore di quella originale
@@ -381,7 +389,7 @@ GdbGeo::Shear( const Point3d& ptOn, const Vector3d& vtNorm, const Vector3d& vtDi
if ( ! pArc->IsPlane() ||
! AreSameOrOppositeVectorExact( pArc->GetNormVersor(), vtNorm)) {
// trasformo in curva di Bezier (semplice o composta)
ICurve* pCrvNew = ArcToBezierCurve( GetCurve( m_pGeoObj)) ;
ICurve* pCrvNew = ArcToBezierCurve( GetCurveArc( m_pGeoObj)) ;
if ( pCrvNew == nullptr)
return false ;
// assegno alla nuova curva estrusione e spessore di quella originale
+2 -2
View File
@@ -1254,13 +1254,13 @@ GdbIterator::GetCalcStatus( int& nStat) const
//----------------------------------------------------------------------------
bool
GdbIterator::SetMark( void)
GdbIterator::SetMark( int nMark)
{
if ( m_pGDB == nullptr || m_pCurrObj == nullptr)
return false ;
// imposto la marcatura
return m_pCurrObj->SetMark() ;
return m_pCurrObj->SetMark( nMark) ;
}
//----------------------------------------------------------------------------
+1 -1
View File
@@ -103,7 +103,7 @@ class GdbIterator : public IGdbIterator
bool RevertStatus( void) override ;
bool GetStatus( int& nStat) const override ;
bool GetCalcStatus( int& nStat) const override ;
bool SetMark( void) override ;
bool SetMark( int nMark = GDB_MK_ON) override ;
bool ResetMark( void) override ;
bool GetMark( int& nMark) const override ;
bool GetCalcMark( int& nMark) const override ;
+4 -4
View File
@@ -612,14 +612,14 @@ GdbObj::GetCalcStatus( int& nStat, int nLev) const
//----------------------------------------------------------------------------
bool
GdbObj::SetMark( void)
GdbObj::SetMark( int nMark)
{
// verifico esistenza (con eventuale creazione) degli attributi
if ( GetSafeAttribs() == nullptr)
return false ;
// assegno la marcatura
m_pAttribs->SetMark() ;
m_pAttribs->SetMark( nMark) ;
return true ;
}
@@ -659,8 +659,8 @@ GdbObj::GetCalcMark( int& nMark) const
nObjMark = m_pAttribs->GetMark() ;
// se la marcatura è ON, non ho bisogno di sapere altro
if ( nObjMark == GDB_MK_ON) {
nMark = GDB_MK_ON ;
if ( nObjMark == GDB_MK_ON || nObjMark == GDB_MK_ON_2) {
nMark = nObjMark ;
return true ;
}
+1 -1
View File
@@ -81,7 +81,7 @@ class GdbObj
bool IsSelected( void) const ;
bool GetStatus( int& nStat) const ;
bool GetCalcStatus( int& nStat, int nLev = 0) const ;
bool SetMark( void) ;
bool SetMark( int nMark) ;
bool ResetMark( void) ;
bool GetMark( int& nMark) const ;
bool GetCalcMark( int& nMark) const ;
+3
View File
@@ -83,7 +83,10 @@ class GeoFrame3d : public IGeoFrame3d, public IGeoObjRW
public : // IGeoObjRW
int GetNgeId( void) const override ;
bool Save( NgeWriter& ngeOut) const override ;
bool PreSave( GdbGeo& Wrapper) const override { return true ; }
bool PostSave( GdbGeo& Wrapper) const override { return true ; }
bool Load( NgeReader& ngeIn) override ;
bool PostLoad( GdbGeo& Wrapper) override { return true ; }
public :
GeoFrame3d( void) ;
+7 -3
View File
@@ -1,13 +1,13 @@
//----------------------------------------------------------------------------
// EgalTech 2014-2014
// EgalTech 2014-2024
//----------------------------------------------------------------------------
// File : GeoObjRW.h Data : 14.03.14 Versione : 1.5d5
// File : GeoObjRW.h Data : 08.03.24 Versione : 2.6c2
// Contenuto : Dichiarazione della interfaccia IGeoObjRW.
//
//
//
// Modifiche : 20.11.13 DS Creazione modulo.
//
// 08.03.24 DS Aggiunte PreSave, PostSave, PreLoad e PostLoad.
//
//----------------------------------------------------------------------------
@@ -15,6 +15,7 @@
class NgeWriter ;
class NgeReader ;
class GdbGeo ;
//-----------------------------------------------------------------------------
class __declspec( novtable) IGeoObjRW
@@ -22,5 +23,8 @@ class __declspec( novtable) IGeoObjRW
public :
virtual int GetNgeId( void) const = 0 ;
virtual bool Save( NgeWriter& ngeOut) const = 0 ;
virtual bool PreSave( GdbGeo& Wrapper) const = 0 ;
virtual bool PostSave( GdbGeo& Wrapper) const = 0 ;
virtual bool Load( NgeReader& ngeIn) = 0 ;
virtual bool PostLoad( GdbGeo& Wrapper) = 0 ;
} ;
+3
View File
@@ -77,7 +77,10 @@ class GeoPoint3d : public IGeoPoint3d, public IGeoObjRW
public : // IGeoObjRW
int GetNgeId( void) const override ;
bool Save( NgeWriter& ngeOut) const override ;
bool PreSave( GdbGeo& Wrapper) const override { return true ; }
bool PostSave( GdbGeo& Wrapper) const override { return true ; }
bool Load( NgeReader& ngeIn) override ;
bool PostLoad( GdbGeo& Wrapper) override { return true ; }
public :
GeoPoint3d( void) ;
+3
View File
@@ -91,7 +91,10 @@ class GeoVector3d : public IGeoVector3d, public IGeoObjRW
public : // IGeoObjRW
int GetNgeId( void) const override ;
bool Save( NgeWriter& ngeOut) const override ;
bool PreSave( GdbGeo& Wrapper) const override { return true ; }
bool PostSave( GdbGeo& Wrapper) const override { return true ; }
bool Load( NgeReader& ngeIn) override ;
bool PostLoad( GdbGeo& Wrapper) override { return true ; }
public :
GeoVector3d( void) ;
+6 -6
View File
@@ -877,7 +877,7 @@ GeomDB::GetFirstNameInGroup( int nGroupId, const string& sName) const
// se ha il nome o la parte iniziale di nome cercato
string sObjName ;
if ( pGdbO->GetName( sObjName) &&
(( ! bWild && sObjName == sToFind) || ( bWild && sObjName.find( sToFind) == 0)))
(( ! bWild && sObjName == sToFind) || ( bWild && sObjName.rfind( sToFind, 0) == 0)))
return ( pGdbO->m_nId) ;
// passo al successivo
pGdbO = pGdbO->GetNext() ;
@@ -905,7 +905,7 @@ GeomDB::GetNextName( int nId, const string& sName) const
// se ha il nome o la parte iniziale di nome cercato
string sObjName ;
if ( pGdbNext->GetName( sObjName) &&
(( ! bWild && sObjName == sToFind) || ( bWild && sObjName.find( sToFind) == 0)))
(( ! bWild && sObjName == sToFind) || ( bWild && sObjName.rfind( sToFind, 0) == 0)))
return ( pGdbNext->m_nId) ;
// passo al successivo
pGdbNext = pGdbNext->GetNext() ;
@@ -933,7 +933,7 @@ GeomDB::GetLastNameInGroup( int nGroupId, const string& sName) const
// se ha il nome o la parte iniziale di nome cercato
string sObjName ;
if ( pGdbO->GetName( sObjName) &&
(( ! bWild && sObjName == sToFind) || ( bWild && sObjName.find( sToFind) == 0)))
(( ! bWild && sObjName == sToFind) || ( bWild && sObjName.rfind( sToFind, 0) == 0)))
return ( pGdbO->m_nId) ;
// passo al precedente
pGdbO = pGdbO->GetPrev() ;
@@ -961,7 +961,7 @@ GeomDB::GetPrevName( int nId, const string& sName) const
// se ha il nome o la parte iniziale di nome cercato
string sObjName ;
if ( pGdbPrev->GetName( sObjName) &&
(( ! bWild && sObjName == sToFind) || ( bWild && sObjName.find( sToFind) == 0)))
(( ! bWild && sObjName == sToFind) || ( bWild && sObjName.rfind( sToFind, 0) == 0)))
return ( pGdbPrev->m_nId) ;
// passo al precedente
pGdbPrev = pGdbPrev->GetPrev() ;
@@ -2310,7 +2310,7 @@ GeomDB::GetCalcStatus( int nId, int& nStat) const
//----------------------------------------------------------------------------
bool
GeomDB::SetMark( int nId)
GeomDB::SetMark( int nId, int nMark)
{
// recupero l'oggetto
GdbObj* pGdbObj = GetGdbObj( nId) ;
@@ -2318,7 +2318,7 @@ GeomDB::SetMark( int nId)
return false ;
// imposto la marcatura
return pGdbObj->SetMark() ;
return pGdbObj->SetMark( nMark) ;
}
//----------------------------------------------------------------------------
+1 -1
View File
@@ -136,7 +136,7 @@ class GeomDB : public IGeomDB
bool RevertStatus( int nId) override ;
bool GetStatus( int nId, int& nStat) const override ;
bool GetCalcStatus( int nId, int& nStat) const override ;
bool SetMark( int nId) override ;
bool SetMark( int nId, int nMark = GDB_MK_ON) override ;
bool ResetMark( int nId) override ;
bool GetMark( int nId, int& nMark) const override ;
bool GetCalcMark( int nId, int& nMark) const override ;
+13 -13
View File
@@ -116,7 +116,7 @@ HashGrid1d::~HashGrid1d( void)
{
Clear() ;
for ( Cell* pCell = m_cell ; pCell < m_cell + m_CellCount ; ++ pCell) {
for ( Cell* pCell = m_cell ; pCell != nullptr && pCell < m_cell + m_CellCount ; ++ pCell) {
if ( pCell->m_neighborOffset != m_stdNeighborOffset)
delete[] pCell->m_neighborOffset ;
}
@@ -396,8 +396,10 @@ HashGrid1d::Enlarge( void)
for ( auto pCell = m_cell ; pCell < m_cell + m_CellCount ; ++ pCell) {
if ( pCell->m_neighborOffset != m_stdNeighborOffset)
delete[] pCell->m_neighborOffset ;
pCell->m_neighborOffset = nullptr ;
}
delete[] m_cell ;
m_cell = nullptr ;
// ... the number of cells is doubled in each coordinate direction, ...
m_CellCount *= 2 ;
@@ -569,7 +571,7 @@ HashGrids1d::Update( void)
// Salvo stato di precedente attivazione delle griglie
bool bGridActivePrev = m_bGridActive ;
// Inseriamo gli oggetti presenti nel vettore m_objsToAdd
if ( m_objsToAdd.size() > 0 ) {
if ( ! m_objsToAdd.empty()) {
for ( auto pObj : m_objsToAdd) {
if ( m_bGridActive)
addGrid( *pObj) ;
@@ -634,24 +636,22 @@ HashGrids1d::Find( const BBox3d& b3Test, INTVECTOR& vnIds) const
sort( vnIds.begin(), vnIds.end()) ;
vnIds.erase( unique( vnIds.begin(), vnIds.end()), vnIds.end()) ;
return ( vnIds.size() > 0) ;
return ( ! vnIds.empty()) ;
}
//----------------------------------------------------------------------------
void
HashGrids1d::Clear( void)
{
for ( auto pGrid : m_GridList) {
delete pGrid ;
}
m_GridList.clear() ;
m_bGridActive = false ;
m_nonGridObjs.clear() ;
m_ObjsList.clear() ;
m_ObjsMap.clear() ;
m_objsToAdd.clear() ;
m_nonGridObjs.clear() ;
for ( auto pGrid : m_GridList)
delete pGrid ;
m_GridList.clear() ;
m_bActivate = true ;
m_bGridActive = false ;
m_b3Objs.Reset() ;
}
+13 -13
View File
@@ -125,7 +125,7 @@ HashGrid2d::~HashGrid2d( void)
{
Clear() ;
for ( Cell* pCell = m_cell ; pCell < m_cell + m_xyCellCount ; ++ pCell) {
for ( Cell* pCell = m_cell ; pCell != nullptr && pCell < m_cell + m_xyCellCount ; ++ pCell) {
if ( pCell->m_neighborOffset != m_stdNeighborOffset)
delete[] pCell->m_neighborOffset ;
}
@@ -445,8 +445,10 @@ HashGrid2d::Enlarge( void)
for ( auto pCell = m_cell ; pCell < m_cell + m_xyCellCount ; ++ pCell) {
if ( pCell->m_neighborOffset != m_stdNeighborOffset)
delete[] pCell->m_neighborOffset ;
pCell->m_neighborOffset = nullptr ;
}
delete[] m_cell ;
m_cell = nullptr ;
// ... the number of cells is doubled in each coordinate direction, ...
m_xCellCount *= 2 ;
@@ -623,7 +625,7 @@ HashGrids2d::Update( void)
// Salvo stato di precedente attivazione delle griglie
bool bGridActivePrev = m_bGridActive ;
// Inseriamo gli oggetti presenti nel vettore m_objsToAdd
if ( m_objsToAdd.size() > 0 ) {
if ( ! m_objsToAdd.empty()) {
for ( auto pObj : m_objsToAdd) {
if ( m_bGridActive)
addGrid( *pObj) ;
@@ -688,24 +690,22 @@ HashGrids2d::Find( const BBox3d& b3Test, INTVECTOR& vnIds) const
sort( vnIds.begin(), vnIds.end()) ;
vnIds.erase( unique( vnIds.begin(), vnIds.end()), vnIds.end()) ;
return ( vnIds.size() > 0) ;
return ( ! vnIds.empty()) ;
}
//----------------------------------------------------------------------------
void
HashGrids2d::Clear( void)
{
for ( auto pGrid : m_GridList) {
delete pGrid ;
}
m_GridList.clear() ;
m_bGridActive = false ;
m_nonGridObjs.clear() ;
m_ObjsList.clear() ;
m_ObjsMap.clear() ;
m_objsToAdd.clear() ;
m_nonGridObjs.clear() ;
for ( auto pGrid : m_GridList)
delete pGrid ;
m_GridList.clear() ;
m_bActivate = true ;
m_bGridActive = false ;
m_b3Objs.Reset() ;
}
+13 -13
View File
@@ -132,7 +132,7 @@ HashGrid3d::~HashGrid3d( void)
{
Clear() ;
for ( Cell* pCell = m_cell ; pCell < m_cell + m_xyzCellCount ; ++ pCell) {
for ( Cell* pCell = m_cell ; pCell != nullptr && pCell < m_cell + m_xyzCellCount ; ++ pCell) {
if ( pCell->m_neighborOffset != m_stdNeighborOffset)
delete[] pCell->m_neighborOffset ;
}
@@ -486,8 +486,10 @@ HashGrid3d::Enlarge( void)
for ( auto pCell = m_cell ; pCell < m_cell + m_xyzCellCount ; ++ pCell) {
if ( pCell->m_neighborOffset != m_stdNeighborOffset)
delete[] pCell->m_neighborOffset ;
pCell->m_neighborOffset = nullptr ;
}
delete[] m_cell ;
m_cell = nullptr ;
// ... the number of cells is doubled in each coordinate direction, ...
m_xCellCount *= 2 ;
@@ -667,7 +669,7 @@ HashGrids3d::Update( void)
// Salvo stato di precedente attivazione delle griglie
bool bGridActivePrev = m_bGridActive ;
// Inseriamo gli oggetti presenti nel vettore m_objsToAdd
if ( m_objsToAdd.size() > 0 ) {
if ( ! m_objsToAdd.empty()) {
for ( auto pObj : m_objsToAdd) {
if ( m_bGridActive)
addGrid( *pObj) ;
@@ -731,7 +733,7 @@ HashGrids3d::Find( const BBox3d& b3Test, INTVECTOR& vnIds) const
sort( vnIds.begin(), vnIds.end()) ;
vnIds.erase( unique( vnIds.begin(), vnIds.end()), vnIds.end()) ;
return ( vnIds.size() > 0) ;
return ( ! vnIds.empty()) ;
}
@@ -739,17 +741,15 @@ HashGrids3d::Find( const BBox3d& b3Test, INTVECTOR& vnIds) const
void
HashGrids3d::Clear( void)
{
for ( auto pGrid : m_GridList) {
delete pGrid ;
}
m_GridList.clear() ;
m_bGridActive = false ;
m_nonGridObjs.clear() ;
m_ObjsList.clear() ;
m_ObjsMap.clear() ;
m_objsToAdd.clear() ;
m_nonGridObjs.clear() ;
for ( auto pGrid : m_GridList)
delete pGrid ;
m_GridList.clear() ;
m_bActivate = true ;
m_bGridActive = false ;
m_b3Objs.Reset() ;
}
+8 -5
View File
@@ -17,6 +17,9 @@
using namespace std ;
//----------------------------------------------------------------------------
static const double EPS_INTER_ARC = 0.1 * EPS_SMALL ;
//----------------------------------------------------------------------------
IntersArcArc::IntersArcArc( const CurveArc& Arc1, const CurveArc& Arc2)
{
@@ -60,15 +63,15 @@ IntersArcArc::IntersArcArc( const CurveArc& Arc1, const CurveArc& Arc2)
vtDir /= dDist ;
// cerchi esterni -> nessuna intersezione
if ( dDist > m_Arc1.GetRadius() + m_Arc2.GetRadius() + EPS_SMALL)
if ( dDist > m_Arc1.GetRadius() + m_Arc2.GetRadius() + EPS_INTER_ARC)
return ;
// cerchi interni -> nessuna intersezione
if ( dDist < abs( m_Arc1.GetRadius() - m_Arc2.GetRadius()) - EPS_SMALL)
if ( dDist < abs( m_Arc1.GetRadius() - m_Arc2.GetRadius()) - EPS_INTER_ARC)
return ;
// cerchi coincidenti -> sovrapposizioni e/o intersezioni agli estremi
if ( dDist < EPS_SMALL && abs( m_Arc1.GetRadius() - m_Arc2.GetRadius()) < EPS_SMALL) {
if ( dDist < EPS_SMALL && abs( m_Arc1.GetRadius() - m_Arc2.GetRadius()) < EPS_INTER_ARC) {
// coefficiente da parametro dell'arco 1 a lunghezza
double dU2L = abs( m_Arc1.GetAngCenter()) * DEGTORAD * m_Arc1.GetRadius() ;
// determino se sono equiversi o controversi
@@ -236,7 +239,7 @@ IntersArcArc::IntersArcArc( const CurveArc& Arc1, const CurveArc& Arc2)
double dSqH = m_Arc1.GetRadius() * m_Arc1.GetRadius() - dA * dA ;
// cerchi tangenti esterni -> una intersezione
if ( abs( dDist - ( m_Arc1.GetRadius() + m_Arc2.GetRadius())) < EPS_SMALL) {
if ( abs( dDist - ( m_Arc1.GetRadius() + m_Arc2.GetRadius())) < EPS_INTER_ARC) {
// tolleranza tangenziale sull'intersezione
double dTgTol = ( dSqH > SQ_EPS_SMALL ? sqrt( dSqH) : EPS_SMALL) ;
// calcolo il punto di intersezione
@@ -358,7 +361,7 @@ IntersArcArc::IntersArcArc( const CurveArc& Arc1, const CurveArc& Arc2)
}
// cerchi tangenti interni -> una intersezione
if ( abs( dDist - abs( m_Arc1.GetRadius() - m_Arc2.GetRadius())) < EPS_SMALL) {
if ( abs( dDist - abs( m_Arc1.GetRadius() - m_Arc2.GetRadius())) < EPS_INTER_ARC) {
// tolleranza tangenziale sull'intersezione
double dTgTol = ( dSqH > SQ_EPS_SMALL ? sqrt( dSqH) : EPS_SMALL) ;
// determino quale dei due contiene l'altro
+9 -1
View File
@@ -78,6 +78,8 @@ IntersCurveCurve::IntersCurveCurve( const ICurve& CurveA, const ICurve& CurveB,
case CRV_COMPO :
LineCrvCompoCalculate( *pCalcCrv[0], *pCalcCrv[1]) ;
break ;
default :
break ;
}
break ;
case CRV_ARC :
@@ -91,6 +93,8 @@ IntersCurveCurve::IntersCurveCurve( const ICurve& CurveA, const ICurve& CurveB,
case CRV_COMPO :
ArcCrvCompoCalculate( *pCalcCrv[0], *pCalcCrv[1]) ;
break ;
default :
break ;
}
break ;
case CRV_COMPO :
@@ -104,8 +108,12 @@ IntersCurveCurve::IntersCurveCurve( const ICurve& CurveA, const ICurve& CurveB,
case CRV_COMPO :
CrvCompoCrvCompoCalculate( *pCalcCrv[0], *pCalcCrv[1]) ;
break ;
default :
break ;
}
break ;
default :
break ;
}
// per curve approssimate, sistemo...
AdjustIntersParams( ( pCalcCrv[0] != m_pCurve[0]), ( pCalcCrv[1] != m_pCurve[1])) ;
@@ -245,7 +253,7 @@ bool
IntersCurveCurve::AdjustIntersParams( bool bAdjCrvA, bool bAdjCrvB)
{
// se non ci sono intersezioni, non va fatto alcunché
if ( m_Info.size() == 0)
if ( m_Info.empty())
return true ;
// se le curve originali non sono state approssimate, non va fatto alcunché
if ( ! bAdjCrvA && ! bAdjCrvB)
+1 -1
View File
@@ -44,7 +44,7 @@ static void
OrderInfoIntersCurveSurfTm( ICSIVECTOR& vInfo)
{
// se non trovati, esco
if ( vInfo.size() == 0)
if ( vInfo.empty())
return ;
// ordino il vettore delle intersezioni secondo il senso crescente del parametro di linea
sort( vInfo.begin(), vInfo.end(),
+1 -1
View File
@@ -14,7 +14,7 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "IntersLineCaps.h"
#include "DistLineLine.h"
#include "/EgtDev/Include/EGkDistLineLine.h"
#include "/EgtDev/Include/EGkIntersLineSphere.h"
using namespace std ;
+31 -26
View File
@@ -19,20 +19,18 @@
using namespace std ;
//----------------------------------------------------------------------------
// Il punto è esterno al FatSegment se dista da questo più di Tol e la sua proiezione sta sul segmento
bool
IsPointOutFatSegment( const Point3d& ptP, const Point3d& ptS, const Vector3d& vtDir, double dLenXY, double dTol)
// Posizione del punto rispetto alla linea (+1=a destra, 0=nella banda di tolleranza, -1=a sinistra)
static int
GetPointToLineSide( const Point3d& ptP, const Point3d& ptS, const Vector3d& vtDir, double dLenXY, double dTol)
{
// distanza del punto dalla linea del segmento (con compensazione piccolissimi errori)
if ( abs( CrossXY( ( ptP - ptS), vtDir)) < ( dTol + EPS_ZERO) * dLenXY)
return false ;
// distanza con segno della proiezione del punto sul segmento dall'inizio per lunghezza segmento
double dDistXY = ScalarXY( ( ptP - ptS), vtDir) ;
// se il punto non si proietta sul segmento entro la tolleranza
if ( dDistXY < - dTol * dLenXY || dDistXY > ( dLenXY + dTol) * dLenXY)
return false ;
// altrimenti
return true ;
double dCross = CrossXY( ( ptP - ptS), vtDir) ;
double dFat = ( dTol + EPS_ZERO) * dLenXY ;
if ( dCross > dFat)
return +1 ;
else if ( dCross < - dFat)
return -1 ;
else
return 0 ;
}
//----------------------------------------------------------------------------
@@ -44,7 +42,7 @@ IntersLineLine::IntersLineLine( const CurveLine& Line1, const CurveLine& Line2,
m_bOverlaps = false ;
m_nNumInters = 0 ;
// verifico validità linee
// verifico validità linee
if ( ! Line1.IsValid() || ! Line2.IsValid())
return ;
@@ -57,7 +55,7 @@ IntersLineLine::IntersLineLine( const CurveLine& Line1, const CurveLine& Line2,
//----------------------------------------------------------------------------
void
IntersLineLine::IntersInfiniteLines( const ICurveLine& Line1, const ICurveLine& Line2)
IntersLineLine::IntersInfiniteLines( const CurveLine& Line1, const CurveLine& Line2)
{
// linea 1 : Start, End, Direzione e Lunghezza
Point3d ptS1 = Line1.GetStart() ;
@@ -118,7 +116,7 @@ IntersLineLine::IntersInfiniteLines( const ICurveLine& Line1, const ICurveLine&
//----------------------------------------------------------------------------
void
IntersLineLine::IntersFiniteLines( const ICurveLine& Line1, const ICurveLine& Line2)
IntersLineLine::IntersFiniteLines( const CurveLine& Line1, const CurveLine& Line2)
{
// verifico sovrapposizione box
BBox3d boxL1 ;
@@ -130,30 +128,36 @@ IntersLineLine::IntersFiniteLines( const ICurveLine& Line1, const ICurveLine& Li
if ( ! boxL1.OverlapsXY( boxL2))
return ;
// linea 1 : Start, End, Direzione e Lunghezza
// segmento 1 : Start, End, Direzione e Lunghezza
Point3d ptS1 = Line1.GetStart() ;
Point3d ptE1 = Line1.GetEnd() ;
Vector3d vtDir1 = ptE1 - ptS1 ;
double dLen1XY = vtDir1.LenXY() ;
if ( dLen1XY < EPS_SMALL)
return ;
// linea 2 : Start, Direzione e Lunghezza
// segmento 2 : Start, Direzione e Lunghezza
Point3d ptS2 = Line2.GetStart() ;
Point3d ptE2 = Line2.GetEnd() ;
Vector3d vtDir2 = ptE2 - ptS2 ;
double dLen2XY = vtDir2.LenXY() ;
if ( dLen2XY < EPS_SMALL)
return ;
// posizioni estremi segmento 1 rispetto a linea 2
int nS1Side = GetPointToLineSide( ptS1, ptS2, vtDir2, dLen2XY, EPS_SMALL) ;
int nE1Side = GetPointToLineSide( ptE1, ptS2, vtDir2, dLen2XY, EPS_SMALL) ;
if ( ( nS1Side == 1 && nE1Side == 1) || ( nS1Side == -1 && nE1Side == -1))
return ;
// posizioni estremi segmento 2 rispetto a linea 1
int nS2Side = GetPointToLineSide( ptS2, ptS1, vtDir1, dLen1XY, EPS_SMALL) ;
int nE2Side = GetPointToLineSide( ptE2, ptS1, vtDir1, dLen1XY, EPS_SMALL) ;
if ( ( nS2Side == 1 && nE2Side == 1) || ( nS2Side == -1 && nE2Side == -1))
return ;
// prodotto vettoriale nel piano XY tra le direzioni delle linee
double dCrossXY = CrossXY( vtDir1, vtDir2) ;
// flag per linee parallele
bool bParallel = ( abs( dCrossXY) < SIN_EPS_ANG_ZERO * ( dLen1XY * dLen2XY)) ;
// flag per segmenti che si allontanano significativamente
bool bFarEnds = ( /*( abs( dCrossXY) > SIN_EPS_ANG_SMALL * ( dLen1XY * dLen2XY)) ||*/
IsPointOutFatSegment( ptS1, ptS2, vtDir2, dLen2XY, EPS_SMALL) ||
IsPointOutFatSegment( ptE1, ptS2, vtDir2, dLen2XY, EPS_SMALL) ||
IsPointOutFatSegment( ptS2, ptS1, vtDir1, dLen1XY, EPS_SMALL) ||
IsPointOutFatSegment( ptE2, ptS1, vtDir1, dLen1XY, EPS_SMALL)) ;
bool bFarEnds = ( nS1Side != 0 || nE1Side != 0 || nS2Side != 0 || nE2Side != 0) ;
// se non sono paralleli e si allontanano tra loro abbastanza
if ( ! bParallel && bFarEnds) {
@@ -168,6 +172,8 @@ IntersLineLine::IntersFiniteLines( const ICurveLine& Line1, const ICurveLine& Li
nPos1 = ICurve::PP_END ; // vicino a fine
else if ( m_Info.IciA[0].dU > 0 && m_Info.IciA[0].dU < 1)
nPos1 = ICurve::PP_MID ; // nell'interno
else
return ;
// verifica posizione intersezione su seconda linea
int nPos2 = ICurve::PP_NULL ; // fuori
if ( abs( m_Info.IciB[0].dU * dLen2XY) < EPS_SMALL)
@@ -176,8 +182,7 @@ IntersLineLine::IntersFiniteLines( const ICurveLine& Line1, const ICurveLine& Li
nPos2 = ICurve::PP_END ; // vicino a fine
else if ( m_Info.IciB[0].dU > 0 && m_Info.IciB[0].dU < 1)
nPos2 = ICurve::PP_MID ; // nell'interno
// se soluzione non accettata, esco
if ( nPos1 == ICurve::PP_NULL || nPos2 == ICurve::PP_NULL)
else
return ;
// limito i parametri a stare sui segmenti (0...1)
m_Info.IciA[0].dU = min( max( m_Info.IciA[0].dU, 0.), 1.) ;
@@ -190,7 +195,7 @@ IntersLineLine::IntersFiniteLines( const ICurveLine& Line1, const ICurveLine& Li
m_Info.IciA[0].nNextTy = ICCT_NULL ;
m_Info.IciB[0].nPrevTy = ICCT_NULL ;
m_Info.IciB[0].nNextTy = ICCT_NULL ;
// si incontrano alle estremità, non si può dire alcunché
// si incontrano alle estremità, non si può dire alcunché
if ( ( nPos1 == ICurve::PP_START || nPos1 == ICurve::PP_END) &&
( nPos2 == ICurve::PP_START || nPos2 == ICurve::PP_END)) {
; // rimangono tutti NULL
+2 -2
View File
@@ -38,8 +38,8 @@ class IntersLineLine
private :
IntersLineLine( void) ;
void IntersInfiniteLines( const ICurveLine& Line1, const ICurveLine& Line2) ;
void IntersFiniteLines( const ICurveLine& Line1, const ICurveLine& Line2) ;
void IntersInfiniteLines( const CurveLine& Line1, const CurveLine& Line2) ;
void IntersFiniteLines( const CurveLine& Line1, const CurveLine& Line2) ;
private :
bool m_bOverlaps ;
+492
View File
@@ -0,0 +1,492 @@
//----------------------------------------------------------------------------
// EgalTech 2024
//----------------------------------------------------------------------------
// File : IntersLineSurfBez.cpp Data : 06.02.24 Versione : 2.6b1
// Contenuto : Implementazione della intersezione linea/superficie bezier.
//
//
//
// Modifiche : 06.02.24 DB Creazione modulo.
//
//
//----------------------------------------------------------------------------
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "CurveLine.h"
#include "CurveBezier.h"
#include "CurveComposite.h"
#include "SurfFlatRegion.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGkDistLineLine.h"
#include "/EgtDev/Include/EGkDistPointSurfFr.h"
#include "/EgtDev/Include/EGkIntersLineTria.h"
#include "/EgtDev/Include/EGkIntersLineSurfTm.h"
#include "/EgtDev/Include/EGkIntersLineSurfBez.h"
#include "/EgtDev/Include/EGkSurfBezier.h"
#include "/EgtDev/Include/ENkPolynomialRoots.h"
using namespace std ;
//----------------------------------------------------------------------------
static bool
RefineIntersNewton( const Point3d& ptL, const Vector3d& vtL, double dLen, bool bFinite,
const ISurfBezier* pSurfBz, Point3d& ptSP, Point3d& ptIBz)
{
// la funzione raffina la posisione del punto ptSP, minimizzando la distanza dalla retta e restituisce il punto di intersezione ptIBz
pSurfBz->GetPointD1D2( ptSP.x / SBZ_TREG_COEFF, ptSP.y / SBZ_TREG_COEFF, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, ptIBz) ;
// usando un algoritmo di newton cerco di avvicinarmi il più possibile alla retta
DistPointLine dpl( ptIBz, ptL, vtL, dLen, bFinite) ;
double dDistNew = 0, dDistPre = 0 ;
dpl.GetDist(dDistNew) ;
int nCount = 0 ;
double dh = EPS_SMALL ;
pSurfBz->GetPointD1D2( ptSP.x, ptSP.y, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, ptIBz) ;
// metodo di newton in più dimensioni
// vario sia il parametro U che il parametro V e verifico se la distanza dalla retta diminuisce per scostamenti positivi o negativi.
while ( dDistNew > EPS_SMALL && nCount < 100) {
dDistPre = dDistNew ;
Point3d ptIBzNew1 ;
pSurfBz->GetPointD1D2( ( ptSP.x + dh) / SBZ_TREG_COEFF, ptSP.y / SBZ_TREG_COEFF, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, ptIBzNew1) ;
DistPointLine dplNewU( ptIBzNew1, ptL, vtL, dLen, bFinite) ;
dplNewU.GetDist( dDistNew) ;
double dfdU = ( dDistNew - dDistPre) / dh ;
Point3d ptIBzNew2 ;
pSurfBz->GetPointD1D2( ptSP.x / SBZ_TREG_COEFF, ( ptSP.y + dh) / SBZ_TREG_COEFF, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, ptIBzNew2) ;
DistPointLine dplNewV( ptIBzNew2, ptL, vtL, dLen, bFinite) ;
dplNewV.GetDist( dDistNew) ;
double dfdV = ( dDistNew - dDistPre) / dh ;
// mi avvicino cercando di annullare la distanza in un colpo solo
double dr = - dDistPre / ( dfdU + dfdV) ;
pSurfBz->GetPointD1D2(( ptSP.x + dr * dfdU) / SBZ_TREG_COEFF, ( ptSP.y + dr * dfdV) / SBZ_TREG_COEFF, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, ptIBz) ;
DistPointLine dplNew( ptIBz, ptL, vtL, dLen, bFinite) ;
dplNew.GetDist( dDistNew) ;
++ nCount ;
}
return ( nCount != 99) ;
}
//----------------------------------------------------------------------------
static void
UpdateInfoIntersLineSurfBz( const Point3d& ptL, const Vector3d& vtDir, int nILT, int nT, const Point3d& ptSP, const Point3d& ptIBz, double dCos,
const Point3d& ptSP2, const Point3d& ptIBz2, double dCos2, ILSBIVECTOR& vInfo)
{
if ( nILT == ILTA_IN || nILT == ILTA_EDGE || nILT == ILTA_VERT || nILT == ILTA_NO_TRIA) {
double dU = ( ptIBz - ptL) * vtDir ;
vInfo.emplace_back( nILT, dU, nT, dCos, ptIBz, ptSP) ;
}
else if ( nILT == ILTA_SEGM || nILT == ILTA_SEGM_ON_EDGE) {
double dU = ( ptIBz - ptL) * vtDir ;
double dU2 = ( ptIBz2 - ptL) * vtDir ;
vInfo.emplace_back( nILT, dU, dU2, nT, dCos2, ptIBz, ptIBz2, ptSP, ptSP2) ;
}
}
//----------------------------------------------------------------------------
static void
OrderInfoIntersLineSurfBz( ILSBIVECTOR& vInfo)
{
// se non trovati, esco
if ( vInfo.empty())
return ;
// ordino il vettore delle intersezioni secondo il senso crescente del parametro di linea
sort( vInfo.begin(), vInfo.end(),
[]( const IntLinSbzInfo& a, const IntLinSbzInfo& b)
{ double dUa = ( ( a.nILTA == ILTA_SEGM || a.nILTA == ILTA_SEGM_ON_EDGE) ? ( a.dU + a.dU2) / 2 : a.dU) ;
double dUb = ( ( b.nILTA == ILTA_SEGM || b.nILTA == ILTA_SEGM_ON_EDGE) ? ( b.dU + b.dU2) / 2 : b.dU) ;
return ( dUa < dUb) ; }) ;
}
//----------------------------------------------------------------------------
// Intersezione di una linea con una superficie di Bezier
//----------------------------------------------------------------------------
bool
IntersLineSurfBz( const Point3d& ptL, const Vector3d& vtL, double dLen, const ISurfBezier* pSurfBz,
ILSBIVECTOR& vInfo, bool bFinite)
{
PtrOwner<ICurveLine> pCL( CreateCurveLine()) ;
if ( bFinite)
pCL->SetPVL(ptL, vtL, dLen) ;
else
pCL->SetPVL(ptL, vtL, 1e6) ;
// verifico linea
Vector3d vtDir = vtL ;
if ( ! vtDir.Normalize( EPS_ZERO))
return false ;
// verifico superficie
if ( pSurfBz == nullptr)
return false ;
// verifico parametro di ritorno
if ( &vInfo == nullptr)
return false ;
vInfo.clear() ;
// trovo le intersezioni con la trimesh ausiliaria
const ISurfTriMesh* pSurfTm = pSurfBz->GetAuxSurf() ;
ILSIVECTOR vInfoTm ;
if ( ! IntersLineSurfTm( ptL, vtL, dLen, *pSurfTm, vInfoTm, bFinite))
return false ;
// ricavo le intersezioni con la superficie di Bezier
for ( IntLinStmInfo InfoTm : vInfoTm ) {
// devo raffinare i parametri lungo la curva, l'angolo e i punti di intersezione
Point3d ptI, ptI2 ;
// devo trovare le intersezioni
Point3d ptSP, ptSP2 ; // coordinate parametriche delle soluzioni
pSurfBz->UnprojectPointFromStm( InfoTm.nT, InfoTm.ptI, ptSP, InfoTm.nILTT) ;
Point3d ptIBz, ptIBz2 ;
if ( ! RefineIntersNewton( ptL, vtL, dLen, bFinite, pSurfBz, ptSP, ptIBz)) {
/////// posso provare anche a rilanciare newton con un punto di partenza diverso oppure con una direzione di avvicinamento diversa///////////////////////////////////
// per restare nel triangolo mi sposto verso un vertice
int nVert[3] ;
pSurfTm->GetTriangle( InfoTm.nT, nVert) ;
double dU0, dV0 ;
pSurfTm->GetVertexParam( nVert[0], dU0, dV0) ;
ptSP = ptSP + Point3d(dU0, dV0, 0) ;
if ( ! RefineIntersNewton( ptL,vtL, dLen, bFinite, pSurfBz, ptSP, ptIBz))
return false ;
}
Vector3d vtN ;
pSurfBz->GetPointNrmD1D2(ptSP.x / SBZ_TREG_COEFF, ptSP.y / SBZ_TREG_COEFF, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, ptIBz, vtN) ;
double dCos = vtN * vtL ;
double dCos2 = 0 ;
// eventualmente ripeto tutto per ptI2 ( se ho un'intersezione con sovrapposizione)
if ( InfoTm.nILTT == ILTA_SEGM || InfoTm.nILTT == ILTA_SEGM_ON_EDGE ) {
pSurfBz->UnprojectPointFromStm( InfoTm.nT, InfoTm.ptI2, ptSP2, InfoTm.nILTT) ;
if ( ! RefineIntersNewton(ptL, vtL, dLen, bFinite, pSurfBz, ptSP2, ptIBz2) ) {
int nVert[3] ;
pSurfTm->GetTriangle( InfoTm.nT, nVert) ;
double dU0, dV0 ;
pSurfTm->GetVertexParam( nVert[0], dU0, dV0) ;
ptSP = ptSP + Point3d(dU0, dV0, 0) ;
if ( ! RefineIntersNewton( ptL,vtL, dLen, bFinite, pSurfBz, ptSP, ptIBz))
return false ;
}
pSurfBz->GetPointNrmD1D2( ptSP2.x / SBZ_TREG_COEFF, ptSP2.y / SBZ_TREG_COEFF, ISurfBezier::FROM_MINUS, ISurfBezier::FROM_MINUS, ptIBz2, vtN) ;
dCos2 = vtN * vtL ;
}
UpdateInfoIntersLineSurfBz( ptL, vtL, InfoTm.nILTT, InfoTm.nT, ptSP, ptIBz, dCos, ptSP2, ptIBz2, dCos2, vInfo) ;
}
OrderInfoIntersLineSurfBz( vInfo) ;
return true ;
}
//----------------------------------------------------------------------------
bool
FilterLineSurfBzInters( const ILSBIVECTOR& vInfo, INTDBLVECTOR& vInters)
{
// tengo per buone la classificazione delle intersezioni fatte sulla trimesh
// ciclo sulle intersezioni
for ( const auto& Info : vInfo) {
// se intersezione puntuale
if ( Info.nILTA == ILTA_VERT || Info.nILTA == ILTA_EDGE || Info.nILTA == ILTA_IN) {
int nFlag = LSBT_TOUCH ;
if ( Info.dCosDN > EPS_ZERO)
nFlag = LSBT_OUT ;
else if ( Info.dCosDN < -EPS_ZERO)
nFlag = LSBT_IN ;
vInters.emplace_back( nFlag, Info.dU) ;
}
// se altrimenti intersezione con coincidenza
else if ( Info.nILTA == ILTA_SEGM || Info.nILTA == ILTA_SEGM_ON_EDGE) {
vInters.emplace_back( LSBT_TG_INI, Info.dU) ;
vInters.emplace_back( LSBT_TG_FIN, Info.dU2) ;
}
}
// elimino intersezioni ripetute
for ( size_t j = 1 ; j < vInters.size() ; ) {
// intersezione precedente
size_t i = j - 1 ;
// se hanno lo stesso parametro
if ( abs( vInters[i].second - vInters[j].second) < EPS_SMALL) {
// se sono entrambe entranti o uscenti, elimino la seconda
if ( ( vInters[i].first == LSBT_IN && vInters[j].first == LSBT_IN) ||
( vInters[i].first == LSBT_OUT && vInters[j].first == LSBT_OUT)) {
vInters.erase( vInters.begin() + j) ;
continue ;
}
// se una entrante e l'altra uscente, cambio in touch ed elimino la seconda
else if ( ( vInters[i].first == LSBT_IN && vInters[j].first == LSBT_OUT) ||
( vInters[i].first == LSBT_OUT && vInters[j].first == LSBT_IN)) {
vInters[i].first = LSBT_TOUCH ;
vInters.erase( vInters.begin() + j) ;
continue ;
}
// se una puntuale e l'altra inizio di coincidenza, elimino la prima
else if ( ( vInters[i].first == LSBT_IN || vInters[i].first == LSBT_OUT || vInters[i].first == LSBT_TOUCH) && vInters[j].first == LSBT_TG_INI) {
vInters.erase( vInters.begin() + i) ;
continue ;
}
// se una fine di coincidenza e l'altra puntuale, elimino la seconda
else if ( vInters[i].first == LSBT_TG_FIN && ( vInters[j].first == LSBT_IN || vInters[j].first == LSBT_OUT || vInters[j].first == LSBT_TOUCH)) {
vInters.erase( vInters.begin() + j) ;
continue ;
}
// se una fine di coincidenza e l'altra inizio di coincidenza, elimino entrambe
else if ( i > 0 && vInters[i].first == LSBT_TG_FIN && vInters[j].first == LSBT_TG_INI) {
vInters.erase( vInters.begin() + j) ;
vInters.erase( vInters.begin() + i) ;
-- j ;
continue ;
}
}
// passo alla successiva
++ j ;
}
return true ;
}
//----------------------------------------------------------------------------
// Intersezione di una linea con una superficie di Bezier
//----------------------------------------------------------------------------
bool
IntersLineSurfBzBilinear( const Point3d& ptL, const Vector3d& vtL, double dLen, const ISurfBezier* pSurfBz,
ILSBIVECTOR& vInfo, bool bFinite)
{
int nDegU, nDegV, nSpanU, nSpanV ;
bool bRat, bTrimmed ;
pSurfBz->GetInfo( nDegU, nDegV, nSpanU, nSpanV, bRat, bTrimmed) ;
// funzione pensata per funzionare solo con una monopatch bilineare
if( nDegU > 1 || nDegV > 1 || nSpanU > 1 || nSpanV > 1 || bRat)
return false ;
int nInters = int( vInfo.size()) ;
PNTVECTOR vPntCtrl ;
for( int p = 0 ; p < 4 ; ++p) {
bool bOk = false ;
vPntCtrl.push_back( pSurfBz->GetControlPoint( p, &bOk)) ;
}
Vector3d a = vPntCtrl[3] - vPntCtrl[1] + ( vPntCtrl[0] - vPntCtrl[2]) ;
Vector3d b = vPntCtrl[1] - vPntCtrl[0] ;
Vector3d c = vPntCtrl[2] - vPntCtrl[0] ;
Vector3d d = vPntCtrl[0] - ORIG ;
double A1 = a.x * vtL.z - a.z * vtL.x ;
double B1 = b.x * vtL.z - b.z * vtL.x ;
double C1 = c.x * vtL.z - c.z * vtL.x ;
double A2 = a.y * vtL.z - a.z * vtL.y ;
double B2 = b.y * vtL.z - b.z * vtL.y ;
double C2 = c.y * vtL.z - c.z * vtL.y ;
double D1 = ( d.x - ptL.x) * vtL.z - ( d.z - ptL.z) * vtL.x ;
double D2 = ( d.y - ptL.y) * vtL.z - ( d.z - ptL.z) * vtL.y ;
DBLVECTOR vdCoeff, vdRoots ;
vdCoeff = { (B2 * D1 - B1 * D2), ( A2 * D1 - A1 * D2 + B2 * C1 - B1 * C2), ( A2 * C1 - A1 * C2)} ;
int nRoots = PolynomialRoots( 2, vdCoeff, vdRoots) ;
bool bFound = false ;
for( int w = 0 ; w < nRoots ; ++w) {
if ( vdRoots[w] > 0 - EPS_ZERO && vdRoots[w] < 1 + EPS_ZERO ) {
double dU = 0, dV = vdRoots[w] ;
// verifico che non sia una soluzione con molteplicità > 1
bool bAlreadyFound = false ;
for ( int k = w - 1 ; k >= 0 && ! bAlreadyFound ; --k)
bAlreadyFound = abs( dV - vdRoots[k]) < EPS_PARAM ;
if( ! bAlreadyFound) {
dU = (dV * (C1 - C2) + ( D1 - D2)) / ( dV * ( A2 - A1) + ( B2 - B1)) ;
if ( dU > - EPS_ZERO && dU < 1 + EPS_ZERO) {
Point3d ptIBez, ptIBez2 ;
Vector3d vtN ;
pSurfBz->GetPointNrmD1D2(dU, dV, ISurfBezier::Side::FROM_MINUS, ISurfBezier::Side::FROM_MINUS, ptIBez, vtN) ;
Point3d ptSP( dU, dV, 0), ptSP2 ;
double dCos = vtN * vtL, dCos2 = 0 ;
UpdateInfoIntersLineSurfBz( ptL, vtL, ILTA_NO_TRIA, -1, ptSP, ptIBez, dCos, ptSP2, ptIBez2, dCos2, vInfo) ;
bFound = true ;
}
}
}
}
// se tutti i coefficienti sono zero allora potrei avere una linea che giace sulla superficie
// per trovare i punti di inizio e fine sovrapposizione trovo i punti a minima distanza tra la linea e gli edge della superficie
if( ! bFound && abs( vdCoeff[0]) < EPS_ZERO && abs( vdCoeff[1]) < EPS_ZERO && abs( vdCoeff[2]) < EPS_ZERO) {
ICRVCOMPOPOVECTOR vCrvEdge( 4) ;
vCrvEdge[0].Set(pSurfBz->GetCurveOnU( 0)) ;
vCrvEdge[1].Set(pSurfBz->GetCurveOnV( 1)) ;
vCrvEdge[2].Set(pSurfBz->GetCurveOnU( 1)) ;
vCrvEdge[3].Set(pSurfBz->GetCurveOnV( 0)) ;
double dAngTolDeg = 5 ;
for( int i = 0 ; i < 4 ; ++i) {
PolyLine plApprox ; vCrvEdge[0]->ApproxWithLines( EPS_SMALL, dAngTolDeg, ICurve::ApprLineType::APL_STD, plApprox) ;
//CurveComposite cCC ;
//cCC.FromPolyLine( plApprox) ;
int nClosestLine = -1 ;
double dMinDist = INFINITO ;
Point3d pt ; plApprox.GetFirstPoint( pt) ;
Point3d ptClosest ;
int c = 0 ;
int nTot = plApprox.GetPointNbr() ;
for( int j = 0 ; j < nTot ; ++j) {
DistPointLine dpl( pt, ptL, vtL, dLen, bFinite) ;
double dDist = INFINITO ;
dpl.GetDist( dDist) ;
if ( dDist < dMinDist) {
nClosestLine = c ;
dMinDist = dDist ;
}
plApprox.GetNextPoint( pt) ;
++ c ;
}
Point3d ptInt1, ptInt2 ;
if ( nClosestLine < nTot - 1 && nClosestLine > 0) {
// tra i due tratti dell'approssimazione che arrivano al punto selezionato come più vicino, devo trovare quale si avvicina di più
Point3d ptStart ; plApprox.GetFirstPoint( ptStart) ;
Point3d ptEnd ;
for( int z = 1 ; z < nClosestLine - 1 ; ++z)
plApprox.GetNextPoint( ptStart) ;
plApprox.GetNextPoint( ptEnd) ;
// linea precedente al punto
Vector3d vtLinePre = ptEnd - ptStart ;
double dLenPre = vtLinePre.Len() ;
DistLineLine dllPre( ptStart, vtLinePre, dLenPre, ptL, vtL,dLen) ;
double dDistPre = INFINITO ;
dllPre.GetDist( dDistPre) ;
// linea che inzia con quel punto
ptStart = ptEnd ;
plApprox.GetNextPoint( ptEnd) ;
Vector3d vtLineCurr = ptEnd - ptStart ;
double dLenCurr = vtLineCurr.Len() ;
DistLineLine dllCurr( ptStart, vtLineCurr, dLenCurr, ptL, vtL,dLen) ;
double dDistCurr = INFINITO ;
dllCurr.GetDist( dDistCurr) ;
if( dDistPre < dDistCurr)
dllPre.GetMinDistPoints( ptInt1, ptInt2) ;
else
dllCurr.GetMinDistPoints( ptInt1, ptInt2) ;
}
else if ( nClosestLine == 0){
// il punto più vicino è sulla prima linea
Point3d ptStart ; plApprox.GetFirstPoint( ptStart) ;
Point3d ptEnd ; plApprox.GetNextPoint( ptEnd) ;
Vector3d vtLineCurr = ptEnd - ptStart ;
double dLenCurr = vtLineCurr.Len() ;
DistLineLine dllCurr( ptStart, vtLineCurr, dLenCurr, ptL, vtL,dLen) ;
dllCurr.GetMinDistPoints( ptInt1, ptInt2) ;
}
else if ( nClosestLine == nTot- 1) {
// il punto più vicino è sull'ultima linea
Point3d ptStart ; plApprox.GetFirstPoint( ptStart) ;
Point3d ptEnd ;
for( int z = 1 ; z < nClosestLine - 1 ; ++z)
plApprox.GetNextPoint( ptStart) ;
plApprox.GetNextPoint( ptEnd) ;
Vector3d vtLinePre = ptEnd - ptStart ;
double dLenPre = vtLinePre.Len() ;
DistLineLine dllCurr( ptStart, vtLinePre, dLenPre, ptL, vtL,dLen) ;
dllCurr.GetMinDistPoints( ptInt1, ptInt2) ;
}
double dU1 = 0, dV1 = 0, dU2 = 0, dV2 = 0 ;
// se ho trovato due punti vuol dire che la linea coincide con un edge e ho trovato tutto quello che serve
if( ! AreSamePointExact( ptInt2, ORIG)) {
if( i == 0) {
//dV1 = 0 ; dV2 = 0 ;
vCrvEdge[0]->GetParamAtPoint( ptInt1, dU1) ;
vCrvEdge[0]->GetParamAtPoint( ptInt2, dU2) ;
}
else if( i == 1) {
//dU1 = 1 ; dU2 = 1 ;
vCrvEdge[1]->GetParamAtPoint( ptInt1, dV1) ;
vCrvEdge[1]->GetParamAtPoint( ptInt2, dV2) ;
}
else if( i == 2){
//dV1 = 1 ; dV2 = 1 ;
vCrvEdge[2]->GetParamAtPoint( ptInt1, dU1) ;
vCrvEdge[2]->GetParamAtPoint( ptInt2, dU2) ;
}
else if( i == 3){
//dU1 = 0 ; dU2 = 0 ;
vCrvEdge[3]->GetParamAtPoint( ptInt1, dV1) ;
vCrvEdge[3]->GetParamAtPoint( ptInt2, dV2) ;
}
Point3d ptIBez1, ptIBez2 ;
Vector3d vtN1, vtN2 ;
pSurfBz->GetPointNrmD1D2(dU1, dV1, ISurfBezier::Side::FROM_MINUS, ISurfBezier::Side::FROM_MINUS, ptIBez1, vtN1) ;
pSurfBz->GetPointNrmD1D2(dU2, dV2, ISurfBezier::Side::FROM_MINUS, ISurfBezier::Side::FROM_MINUS, ptIBez2, vtN2) ;
Point3d ptSP1( dU1, dV1, 0) ;
double dCos1 = vtN1 * vtL ;
Point3d ptSP2( dU2, dV2, 0) ;
double dCos2 = vtN2 * vtL ;
// se avevo già trovato un punto singolo che coincide col primo punto di questa intersezione sovrapposta, allora cancello l'intersezione singola che
// avevo salvato e aggiungo quella sovrapposto che ho trovato ora
if( bFound) {
int nNewTot = int(vInfo.size()) ;
int nNewInters = nNewTot - nInters ;
bool bAlreadyFound = false ;
for( int i = 0 ; i < nNewInters ; ++i) {
bAlreadyFound = AreSamePointApprox(vInfo[nNewTot - i].ptUV, ptSP1) || AreSamePointApprox(vInfo[nNewTot - i].ptUV, ptSP2) ;
if ( bAlreadyFound) {
vInfo.erase( vInfo.begin() + nNewTot - i) ;
break ;
}
}
}
UpdateInfoIntersLineSurfBz( ptL, vtL, ILTA_NO_TRIA, -1, ptSP1, ptIBez1, dCos1, ptSP2, ptIBez2, dCos2, vInfo) ;
bFound = true ;
break ;
}
// se ho trovato un punto a distanza zero dalla linea allora ho trovato l'intersezione
else if( dMinDist < EPS_SMALL) {
if( i == 0) {
//dV1 = 0 ;
vCrvEdge[0]->GetParamAtPoint( ptInt1, dU1) ;
}
else if( i == 1) {
//dU1 = 1 ;
vCrvEdge[1]->GetParamAtPoint( ptInt1, dV1) ;
}
else if( i == 2){
//dV1 = 1 ;
vCrvEdge[2]->GetParamAtPoint( ptInt1, dU1) ;
}
else if( i == 3){
//dU1 = 0 ;
vCrvEdge[3]->GetParamAtPoint( ptInt1, dV1) ;
}
Point3d ptSP1( dU1, dV1, 0), ptSP2 ;
// se avevo trovato già altri punti controllo di non essere esattamente su una diagonale ( e quindi avere un'intersezione con ogni edge, ma due sono doppie)
if( bFound) {
int nNewTot = int(vInfo.size()) ;
int nNewInters = nNewTot - nInters ;
bool bAlreadyFound = false ;
for( int i = 0 ; i < nNewInters ; ++i)
bAlreadyFound = AreSamePointApprox(vInfo[nNewTot - i].ptUV, ptSP1) ;
if( bAlreadyFound)
continue ;
}
Point3d ptIBez1, ptIBez2 ;
Vector3d vtN1, vtN2 ;
pSurfBz->GetPointNrmD1D2(dU1, dV1, ISurfBezier::Side::FROM_MINUS, ISurfBezier::Side::FROM_MINUS, ptIBez1, vtN1) ;
double dCos1 = vtN1 * vtL, dCos2 = 0 ;
UpdateInfoIntersLineSurfBz( ptL, vtL, ILTA_NO_TRIA, -1, ptSP1, ptIBez1, dCos1, ptSP2, ptIBez2, dCos2, vInfo) ;
bFound = true ;
}
}
}
// se la superficie è trimmed verifico che i punti trovati siano all'interno del parametrico trimmato
if( bTrimmed && bFound) {
int nNewTot = int(vInfo.size()) ;
int nNewInters = nNewTot - nInters ;
const ISurfFlatRegion* pFRTrim = pSurfBz->GetTrimRegion() ;
for( int i = 0 ; i < nNewInters ; ++i) {
Point3d ptTest = vInfo[nNewTot - i].ptUV * SBZ_TREG_COEFF ;
bool bInside = false ;
double dDist = INFINITO ;
IsPointInsideSurfFr( ptTest, pFRTrim, dDist, bInside) ;
if( ! bInside)
vInfo.erase( vInfo.begin() + nNewTot - i) ;
}
}
return true ;
}
+1 -1
View File
@@ -1670,7 +1670,7 @@ LineTorus( const Point3d& ptLine, const Vector3d& vtLine,
// Studio le soluzioni
int nIntType = T_ERROR ;
if ( vdPar.size() == 0)
if ( vdPar.empty())
nIntType = T_NO_INT ;
else if ( vdPar.size() == 1) {
nIntType = T_ONE_TAN ;
+109 -22
View File
@@ -23,20 +23,20 @@ using namespace std ;
//----------------------------------------------------------------------------
static void
UpdateInfoIntersLineSurfTm( const Point3d& ptL, const Vector3d& vtDir, double dLen,
int nT, const Triangle3d& Tria, ILSIVECTOR& vInfo, bool bFinite)
int nStm, int nT, const Triangle3d& Tria, ILSIVECTOR& vInfo, bool bFinite)
{
Point3d ptInt, ptInt2 ;
int nRes = IntersLineTria( ptL, vtDir, dLen, Tria, ptInt, ptInt2, bFinite) ;
if ( nRes == ILTT_IN || nRes == ILTT_EDGE || nRes == ILTT_VERT) {
double dU = ( ptInt - ptL) * vtDir ;
double dCosDN = vtDir * Tria.GetN() ;
vInfo.emplace_back( nRes, dU, nT, dCosDN, ptInt) ;
vInfo.emplace_back( nRes, dU, nStm, nT, dCosDN, ptInt) ;
}
else if ( nRes == ILTT_SEGM || nRes == ILTT_SEGM_ON_EDGE) {
double dU = ( ptInt - ptL) * vtDir ;
double dU2 = ( ptInt2 - ptL) * vtDir ;
double dCosDN = vtDir * Tria.GetN() ;
vInfo.emplace_back( nRes, dU, dU2, nT, dCosDN, ptInt, ptInt2) ;
vInfo.emplace_back( nRes, dU, dU2, nStm, nT, dCosDN, ptInt, ptInt2) ;
}
}
@@ -45,13 +45,15 @@ static void
OrderInfoIntersLineSurfTm( ILSIVECTOR& vInfo)
{
// se non trovati, esco
if ( vInfo.size() == 0)
if ( vInfo.empty())
return ;
// ordino il vettore delle intersezioni secondo il senso crescente del parametro di linea
sort( vInfo.begin(), vInfo.end(),
sort( vInfo.begin(), vInfo.end(),
[]( const IntLinStmInfo& a, const IntLinStmInfo& b)
{ double dUa = ( ( a.nILTT == ILTT_SEGM || a.nILTT == ILTT_SEGM_ON_EDGE) ? ( a.dU + a.dU2) / 2 : a.dU) ;
double dUb = ( ( b.nILTT == ILTT_SEGM || b.nILTT == ILTT_SEGM_ON_EDGE) ? ( b.dU + b.dU2) / 2 : b.dU) ;
if ( abs( dUa - dUb) < EPS_SMALL)
return ( a.dCosDN < b.dCosDN) ;
return ( dUa < dUb) ; }) ;
}
@@ -106,7 +108,7 @@ IntersLineSurfTm( const Point3d& ptL, const Vector3d& vtL, double dLen, const IS
Triangle3d Tria ;
Stm.GetTriangle( nT, Tria) ;
// aggiorno info con intersezione
UpdateInfoIntersLineSurfTm( ptL, vtDir, dLen, nT, Tria, vInfo, bFinite) ;
UpdateInfoIntersLineSurfTm( ptL, vtDir, dLen, 0, nT, Tria, vInfo, bFinite) ;
}
}
}
@@ -122,19 +124,23 @@ IntersLineSurfTm( const Point3d& ptL, const Vector3d& vtL, double dLen, const IS
// Intersezione di molte linee parallele con una superficie TriMesh
//----------------------------------------------------------------------------
IntersParLinesSurfTm::IntersParLinesSurfTm( const Frame3d& frLines, const ISurfTriMesh& Stm)
: m_bOk( false), m_frLines( frLines), m_pSTm( &Stm)
: m_bOk( false), m_frLines( frLines), m_vpSTm( {&Stm})
{
// verifico esistenza superficie
if ( m_pSTm == nullptr || ! m_pSTm->IsValid())
if ( m_vpSTm[0] == nullptr || ! m_vpSTm[0]->IsValid())
return ;
// creo HashGrid 2d
const int LIM_HG_TRIA = 127 ;
m_HGrids.SetActivationGrid( m_pSTm->GetTriangleCount() > LIM_HG_TRIA) ;
// aggiorno il vettore degli indici di base per mappare i triangoli con le rispettivi superfici
// ( in questo caso la superficie è unica, quindi ho solo due elementi)
m_vBaseInd = { 0, m_vpSTm[0]->GetTriangleCount()} ;
// riempio HashGrid
// creo HashGrid 2d ed eventualmente attivo la griglia
const int LIM_HG_TRIA = 127 ;
m_HGrids.SetActivationGrid( m_vBaseInd.back() > LIM_HG_TRIA) ;
// riempio HashGrid
Triangle3d Tria ;
int nT = Stm.GetFirstTriangle( Tria) ;
int nT = m_vpSTm[0]->GetFirstTriangle( Tria) ;
while ( nT != SVT_NULL) {
// calcolo il BBox del triangolo nel riferimento scelto
Tria.ToLoc( m_frLines) ;
@@ -143,10 +149,55 @@ IntersParLinesSurfTm::IntersParLinesSurfTm( const Frame3d& frLines, const ISurfT
b3Tria.Add( Tria.GetP( 1)) ;
b3Tria.Add( Tria.GetP( 2)) ;
// inserisco nella griglia
if ( ! m_HGrids.Add( nT, b3Tria))
if ( ! m_HGrids.Add( nT, b3Tria)) // ( 0 + nT, Tria)
return ;
// passo al prossimo triangolo
nT = Stm.GetNextTriangle( nT, Tria) ;
// passo al prossimo triangolo
nT = m_vpSTm[0]->GetNextTriangle( nT, Tria) ;
}
// aggiorno
m_bOk = m_HGrids.Update() ;
}
//----------------------------------------------------------------------------
// Intersezione di molte linee parallele con un vettore di superfici TriMesh
//----------------------------------------------------------------------------
IntersParLinesSurfTm::IntersParLinesSurfTm( const Frame3d& frLines, const CISURFTMPVECTOR& vStm)
: m_bOk( false), m_frLines( frLines), m_vpSTm( vStm), m_vBaseInd( {0})
{
// verifico esistenza superfici
if ( m_vpSTm.empty())
return ;
for ( const ISurfTriMesh* pStm : m_vpSTm) {
if ( pStm == nullptr || ! pStm->IsValid())
return ;
}
// aggiorno il vettore degli indici di base per mappare i triangoli con le rispettivi superfici
// NB. dal costruttore è già inizializzato a {0}
for ( int i = 0 ; i < int( m_vpSTm.size()) ; ++ i)
m_vBaseInd.emplace_back( m_vBaseInd.back() + m_vpSTm[i]->GetTriangleCount()) ;
// creo HashGrid 2d ed eventualmente attivo la griglia
const int LIM_HG_TRIA = 256 ;
m_HGrids.SetActivationGrid( m_vBaseInd.back() > LIM_HG_TRIA) ;
// riempio HashGrid
for ( int i = 0 ; i < int( m_vpSTm.size()) ; ++ i) {
Triangle3d Tria ;
int nT = m_vpSTm[i]->GetFirstTriangle( Tria) ;
while ( nT != SVT_NULL) {
// calcolo il BBox del triangolo nel riferimento scelto
Tria.ToLoc( m_frLines) ;
BBox3d b3Tria ;
b3Tria.Add( Tria.GetP( 0)) ;
b3Tria.Add( Tria.GetP( 1)) ;
b3Tria.Add( Tria.GetP( 2)) ;
// inserisco nella griglia ( aggiungo shift per indice del triangolo)
if ( ! m_HGrids.Add( m_vBaseInd[i] + nT, b3Tria))
return ;
// passo al prossimo triangolo
nT = m_vpSTm[i]->GetNextTriangle( nT, Tria) ;
}
}
// aggiorno
m_bOk = m_HGrids.Update() ;
@@ -160,7 +211,7 @@ IntersParLinesSurfTm::GetInters( const Point3d& ptL, double dLen, ILSIVECTOR& vI
if ( &vInfo == nullptr)
return false ;
vInfo.clear() ;
// verifico validità
// verifico validità
if ( ! m_bOk)
return false ;
@@ -172,15 +223,22 @@ IntersParLinesSurfTm::GetInters( const Point3d& ptL, double dLen, ILSIVECTOR& vI
Point3d ptLL = ptL ;
ptLL.ToGlob( m_frLines) ;
// recupero indici triangoli che intersecano box in 2d
// recupero indici triangoli che intersecano box in 2d
INTVECTOR vnIds ;
if ( m_HGrids.Find( b3Line, vnIds)) {
for ( int i = 0 ; i < int( vnIds.size()) ; ++ i) {
int nT = vnIds[i] ;
// recupero la superficie
int nInd = vnIds[i] ;
int nSurf = GetSurfInd( nInd) ;
if ( nSurf == -1)
return false ;
// recupero il triangolo
int nT = nInd - m_vBaseInd[nSurf] ;
Triangle3d Tria ;
m_pSTm->GetTriangle( nT, Tria) ;
if ( ! m_vpSTm[nSurf]->GetTriangle( nT, Tria))
return false ;
// aggiorno info con intersezione
UpdateInfoIntersLineSurfTm( ptLL, m_frLines.VersZ(), dLen, nT, Tria, vInfo, bFinite) ;
UpdateInfoIntersLineSurfTm( ptLL, m_frLines.VersZ(), dLen, nSurf, nT, Tria, vInfo, bFinite) ;
}
}
@@ -190,6 +248,35 @@ IntersParLinesSurfTm::GetInters( const Point3d& ptL, double dLen, ILSIVECTOR& vI
return true ;
}
//----------------------------------------------------------------------------
int
IntersParLinesSurfTm::GetSurfInd( int nT) const
{
// verifico la presenza di almeno un intervallo
if ( m_vBaseInd.size() < 2)
return -1 ;
// se la superficie è unica, allora non devo cercarla
if ( int( m_vBaseInd.size()) == 2)
return 0 ;
// ricerca binaria dell'intervallo contenente la posizione del triangolo
int nS = 0 ;
int nE = int( m_vBaseInd.size()) - 1 ;
while ( true) {
if ( nT < m_vBaseInd[nS] || nT >= m_vBaseInd[nE])
return -1 ;
if ( nE - nS == 1)
return nS ;
int nM = ( nS + nE) / 2 ;
if ( nT == m_vBaseInd[nM])
return nM ;
if ( nT < m_vBaseInd[nM])
nE = nM ;
else
nS = nM ;
}
return -1 ;
}
//----------------------------------------------------------------------------
bool
FilterLineSurfTmInters( const ILSIVECTOR& vInfo, INTDBLVECTOR& vInters)
@@ -215,7 +302,7 @@ FilterLineSurfTmInters( const ILSIVECTOR& vInfo, INTDBLVECTOR& vInters)
for ( size_t j = 1 ; j < vInters.size() ; ) {
// intersezione precedente
size_t i = j - 1 ;
// se hanno lo stesso parametro
// se hanno lo stesso parametro
if ( abs( vInters[i].second - vInters[j].second) < EPS_SMALL) {
// se sono entrambe entranti o uscenti, elimino la seconda
if ( ( vInters[i].first == LST_IN && vInters[j].first == LST_IN) ||
+2 -2
View File
@@ -17,8 +17,8 @@
#include "CurveLine.h"
#include "IntersLineLine.h"
#include "IntersLineTria.h"
#include "DistPointLine.h"
#include "DistLineLine.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGkDistLineLine.h"
#include "/EgtDev/Include/EGkIntersLinePlane.h"
#include "/EgtDev/Include/EGkFrame3d.h"
#include <array>
+1 -1
View File
@@ -42,5 +42,5 @@ Inters3Planes( const Plane3d& plPlane1, const Plane3d& plPlane2, const Plane3d&
if ( IntersPlanePlane( plPlane1, plPlane2, ptL, vtL) != IPPT_YES)
return IPPT_NO ;
// intersezione della linea con il terzo piano
return ( IntersLinePlane( ptL, vtL, 1, plPlane3, ptInt) == ILPT_YES ? IPPT_YES : IPPT_NO) ;
return ( IntersLinePlane( ptL, vtL, 1, plPlane3, ptInt, false) == ILPT_YES ? IPPT_YES : IPPT_NO) ;
}
+1 -1
View File
@@ -15,7 +15,7 @@
#include "stdafx.h"
#include "ProjPlane.h"
#include "CurveLine.h"
#include "DistPointLine.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGkIntersPlaneSurfTm.h"
#include "/EgtDev/Include/EGkIntersPlaneTria.h"
#include "/EgtDev/Include/EGkIntersLineSurfTm.h"
+1 -1
View File
@@ -13,9 +13,9 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "DistPointLine.h"
#include "IntersLineTria.h"
#include "DllMain.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGkIntersSurfTmSurfTm.h"
#include "/EgtDev/Include/EGkIntersTriaTria.h"
#include "/EgtDev/Include/EGkPointGrid3d.h"
+1 -1
View File
@@ -14,7 +14,7 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "CreateCurveAux.h"
#include "DistPointLine.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGkLineTgCurvePerpCurve.h"
#include "/EgtDev/Include/EGkLinePntTgCurve.h"
#include "/EgtDev/Include/EgtPointerOwner.h"
+1 -1
View File
@@ -14,7 +14,7 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "CreateCurveAux.h"
#include "DistPointLine.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGkLineTgTwoCurves.h"
#include "/EgtDev/Include/EgtPointerOwner.h"
+155 -33
View File
@@ -2,7 +2,7 @@
// EgalTech 2013-2013
//----------------------------------------------------------------------------
// File : OffsetAux.cpp Data : 23.11.23 Versione : 2.5k5
// Contenuto : Implementazione di alcune funzioni di utilità per gli offset delle curve.
// Contenuto : Implementazione di alcune funzioni di utilità per gli offset delle curve.
//
//
//
@@ -16,20 +16,24 @@
#include "CurveArc.h"
#include "CurveLine.h"
#include "GeoConst.h"
#include "/EgtDev/Include/EGkIntervals.h"
#include "/EgtDev/Include/EGkIntersCurves.h"
#include "/EgtDev/Include/EGkChainCurves.h"
using namespace std ;
//----------------------------------------------------------------------------
static bool IsFillet( const ICurve* pCrv, double dDist) ;
static bool ModifyFillet( ICurve* pCrv, double dDist, int nType, ICurveComposite& ccAux) ;
static bool AdjustIntersections( ICRVCOMPOPVECTOR& CrvList) ;
//----------------------------------------------------------------------------
bool
IdentifyFillets( ICurveComposite* pCrvCo, double dDist)
{
// identifico le sottocurve di tipo fillet e assegno loro temp param 1.0 per riconoscerle nella funzione AdjustCurveFillets
for ( int i = 0 ; i < pCrvCo->GetCurveCount() ; i ++) {
// recupero la curva
PtrOwner<ICurve> pCrv( pCrvCo->GetCurve(i)->Clone()) ;
if ( IsNull( pCrv))
return false ;
if ( IsFillet( pCrv, dDist))
if ( IsFillet( pCrvCo->GetCurve( i), dDist))
pCrvCo->SetCurveTempParam( i, 1.0) ;
else
pCrvCo->SetCurveTempParam( i, 0.0) ;
@@ -39,12 +43,14 @@ IdentifyFillets( ICurveComposite* pCrvCo, double dDist)
//----------------------------------------------------------------------------
bool
IsFillet( ICurve* pCrv, double dDist)
IsFillet( const ICurve* pCrv, double dDist)
{
if ( pCrv == nullptr)
return false ;
// deve essere un arco
if ( pCrv->GetType() != CRV_ARC)
return false ;
CurveArc* pArc = GetBasicCurveArc( pCrv) ;
const CurveArc* pArc = GetBasicCurveArc( pCrv) ;
// deve avere raggio uguale alla distanza di offset
if ( abs( pArc->GetRadius() - abs( dDist)) > EPS_SMALL)
return false ;
@@ -54,36 +60,76 @@ IsFillet( ICurve* pCrv, double dDist)
//----------------------------------------------------------------------------
bool
AdjustCurveFillets( ICurveComposite* pCrvCo, double dDist, int nType)
AdjustCurveFillets( ICURVEPOVECTOR& vOffset, double dDist, int nType)
{
ICURVEPLIST CrvLst ;
PtrOwner<ICurve> pCrv( pCrvCo->RemoveFirstOrLastCurve( false)) ;
while ( ! IsNull( pCrv)) {
// se identificato come fillet lo trasformo in smusso o estensione
if ( pCrv->GetTempParam() > EPS_SMALL) {
CurveComposite ccTemp ;
ModifyFillet( pCrv, dDist, nType, ccTemp) ;
// metto in lista le curve risultanti
if ( ccTemp.GetCurveCount() > 0) {
PtrOwner<ICurve> pCrv2( ccTemp.RemoveFirstOrLastCurve( false)) ;
while ( ! IsNull( pCrv2)) {
CrvLst.push_back( Release( pCrv2)) ;
pCrv2.Set( ccTemp.RemoveFirstOrLastCurve( false)) ;
}
if ( vOffset.empty())
return true ;
// suddivido le curve di offset individuando i fillet e isolandoli dagli altri tratti
ICRVCOMPOPVECTOR vCrvs ;
for ( int i = 0 ; i < int( vOffset.size()) ; i ++) {
CurveComposite* pCompo = GetBasicCurveComposite( vOffset[i]) ;
if ( pCompo == nullptr)
return false ;
bool bNewCrv = true ;
PtrOwner<ICurve> pCrv( pCompo->RemoveFirstOrLastCurve(false)) ;
while ( ! IsNull( pCrv)) {
if ( pCrv->GetTempParam() > EPS_SMALL) {
// se fillet calcolo il nuovo raccordo
CurveComposite* ccTemp = CreateBasicCurveComposite() ;
ModifyFillet( pCrv, dDist, nType, *ccTemp) ;
// assegno temp param per identificarlo nei conti successivi
ccTemp->SetTempParam( 1) ;
vCrvs.push_back( ccTemp) ;
bNewCrv = true ;
}
else {
// aggiungo la curva
if ( bNewCrv) {
bNewCrv = false ;
CurveComposite* pCompo = ConvertCurveToBasicComposite( Release( pCrv)) ;
if ( pCompo == nullptr)
return false ;
vCrvs.push_back( pCompo) ;
}
else
vCrvs.back()->AddCurve( Release( pCrv)) ;
}
// passo alla curva successiva
pCrv.Set( pCompo->RemoveFirstOrLastCurve( false)) ;
}
// altrimenti salvo in lista
else
CrvLst.push_back( Release( pCrv)) ;
// passo alla curva successiva
pCrv.Set( pCrvCo->RemoveFirstOrLastCurve( false)) ;
}
// rimetto le curve nella composita
for ( auto pCrv : CrvLst) {
pCrvCo->AddCurve( pCrv) ;
vOffset.clear() ;
// gestione delle intersezioni
if ( ! AdjustIntersections( vCrvs))
return false ;
// concateno i tratti ottenuti
ChainCurves ChainCrv ;
ChainCrv.Init( false, 2 * EPS_SMALL, vCrvs.size()) ;
for ( int i = 0 ; i < int( vCrvs.size()); ++ i) {
Point3d ptS, ptE ;
Vector3d vtS, vtE ;
vCrvs[i]->GetStartPoint( ptS) ;
vCrvs[i]->GetEndPoint( ptE) ;
vCrvs[i]->GetStartDir( vtS) ;
vCrvs[i]->GetEndDir( vtE) ;
ChainCrv.AddCurve( i + 1, ptS, vtS, ptE, vtE) ;
}
// recupero i concatenamenti
Point3d ptRef ; vCrvs[0]->GetStartPoint( ptRef) ;
INTVECTOR vIds ;
while ( ChainCrv.GetChainFromNear( ptRef, false, vIds)) {
PtrOwner<CurveComposite> pCompo( CreateBasicCurveComposite()) ;
if ( IsNull( pCompo))
return false ;
for ( auto i : vIds)
pCompo->AddCurve( vCrvs[i-1]) ;
pCompo->MergeCurves( LIN_TOL_MIN, ANG_TOL_STD_DEG) ;
pCompo->GetEndPoint( ptRef) ;
vOffset.emplace_back( Release( pCompo)) ;
}
// unisco tratti allineati
pCrvCo->MergeCurves( LIN_TOL_MIN, ANG_TOL_STD_DEG) ;
return true ;
}
@@ -177,3 +223,79 @@ ModifyFillet( ICurve* pCrv, double dDist, int nType, ICurveComposite& ccAux)
}
return false ;
}
//----------------------------------------------------------------------------
bool
AdjustIntersections( ICRVCOMPOPVECTOR& vCrvs)
{
// sistema le curve nel vettore vCrvs eliminando le parti coinvolte nelle intersezioni
vector<Intervals> vIntervals( vCrvs.size()) ;
INTVECTOR vFillets ;
for ( int i = 0 ; i < int( vCrvs.size()) ; i ++) {
// salvo i parametri della curva
double dParS, dParE ;
vCrvs[i]->GetDomain( dParS, dParE) ;
vIntervals[i].Set( dParS, dParE) ;
// verifico se raccordo
if ( vCrvs[i]->GetTempParam() > EPS_SMALL)
vFillets.emplace_back( i) ;
}
// verifico se i raccordi intersecano le altre curve
bool bInters = false ;
for ( int i = 0 ; i < int( vFillets.size()) ; i ++) {
int nIdx = vFillets[i] ;
for ( int j = 0 ; j < int( vCrvs.size()) ; j ++) {
if ( j == nIdx)
continue ;
IntersCurveCurve intCC( *vCrvs[nIdx], *vCrvs[j]) ;
int nCnt = intCC.GetIntersCount() ;
if ( nCnt > 1) {
// aggiorno gli intervalli della curva sottraendo la parte coinvolta dall'intersezione
for ( int k = 0 ; k < nCnt - 1 ; k = k+2) {
IntCrvCrvInfo iccInfo1, iccInfo2 ;
intCC.GetIntCrvCrvInfo( k, iccInfo1) ;
// verifico non sia intersezione nell'estremo iniziale o sovrapposizione
if ( iccInfo1.IciA[0].dU < EPS_SMALL || iccInfo1.bOverlap) {
k-- ;
continue ;
}
intCC.GetIntCrvCrvInfo( k+1, iccInfo2) ;
vIntervals[nIdx].Subtract( iccInfo1.IciA[0].dU, iccInfo2.IciA[0].dU) ;
vIntervals[j].Subtract( iccInfo1.IciB[0].dU, iccInfo2.IciB[0].dU) ;
bInters = true ;
}
}
}
}
if ( ! bInters)
return true ;
// aggiorno le curve eliminando i tratti coinvolti nelle intersezioni
for ( int i = 0 ; i < int( vIntervals.size()) ; i++) {
if ( vIntervals[i].GetCount() > 1) {
PtrOwner<CurveComposite> pCompo( CloneBasicCurveComposite( vCrvs[i])) ;
if ( IsNull( pCompo))
return false ;
double dParS, dParE ;
vIntervals[i].GetFirst( dParS, dParE) ;
vCrvs[i]->TrimStartEndAtParam( dParS, dParE) ;
while ( vIntervals[i].GetNext( dParS, dParE)) {
CurveComposite* pCrv = ConvertCurveToBasicComposite( pCompo->CopyParamRange( dParS, dParE)) ;
if ( pCrv == nullptr)
return false ;
vCrvs.emplace_back( pCrv) ;
}
}
else {
double dParS, dParE ;
vIntervals[i].GetFirst( dParS, dParE) ;
vCrvs[i]->TrimStartEndAtParam( dParS, dParE) ;
}
}
return true ;
}
+2 -4
View File
@@ -2,7 +2,7 @@
// EgalTech 2013-2013
//----------------------------------------------------------------------------
// File : OffsetAux.h Data : 23.11.23 Versione : 2.5k5
// Contenuto : Dichiarazione di alcune funzioni di utilità per gli offset delle curve.
// Contenuto : Dichiarazione di alcune funzioni di utilità per gli offset delle curve.
//
//
//
@@ -16,6 +16,4 @@
//----------------------------------------------------------------------------
bool IdentifyFillets( ICurveComposite* pCrvCo, double dDist) ;
bool IsFillet( ICurve* pCrv, double dDist) ;
bool AdjustCurveFillets( ICurveComposite* pCrvCo, double dDist, int nType) ;
bool ModifyFillet( ICurve* pCrv, double dDist, int nType, ICurveComposite& ccAux) ;
bool AdjustCurveFillets( ICURVEPOVECTOR& vCrvs, double dDist, int nType) ;
+84 -28
View File
@@ -60,6 +60,8 @@ OffsetCurve::Reset( void)
}
}
m_CrvLst.clear() ;
m_ptOffs = P_INVALID ;
m_vtOut = V_INVALID ;
return true ;
}
@@ -74,7 +76,7 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
// verifico che la curva esista
if ( pCrv == nullptr)
return false ;
// verifico se la curva è un segmento di retta
// verifico se la curva è un segmento di retta
bool bIsLine = false ;
const CurveLine* pLine = GetBasicCurveLine( pCrv) ;
if ( pLine != nullptr)
@@ -85,7 +87,7 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
if ( pCompo != nullptr && pCompo->IsALine( m_dLinTol, ptStart, ptEnd))
bIsLine = true ;
}
// verifico che la curva sia piana (per le linee è comunque sempre vero)
// verifico che la curva sia piana (per le linee è comunque sempre vero)
Plane3d plPlane ;
if ( ! pCrv->IsFlat( plPlane, bIsLine, 10 * EPS_SMALL) && ! bIsLine)
return false ;
@@ -167,7 +169,7 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
// -------------------- OFFSET STANDARD ---------------------------------
if ( ! USE_VORONOI) {
// verifico che la curva sia fatta solo da rette e archi che giacciono nel piano XY (VtExtr è ora Z+)
// verifico che la curva sia fatta solo da rette e archi che giacciono nel piano XY (VtExtr è ora Z+)
if ( ! ccCopy.ArcsBezierCurvesToArcsPerpExtr( m_dLinTol, ANG_TOL_STD_DEG))
return false ;
@@ -187,11 +189,11 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
if ( ! ccCopy.MergeCurves( m_dLinTol, ANG_TOL_STD_DEG, bClosed, true))
return false ;
// verifico se il punto iniziale è stato modificato
// verifico se il punto iniziale è stato modificato
Point3d ptNewStart ; ccCopy.GetStartPoint( ptNewStart) ;
bChangeStart = ( ! AreSamePointApprox( ptNewStart, ptStart)) ;
// calcolo le lunghezze delle diverse entità
// calcolo le lunghezze delle diverse entità
DBLVECTOR vLens ;
{
const ICurve* pCrv1 = ccCopy.GetFirstCurve() ;
@@ -203,7 +205,7 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
pCrv1 = ccCopy.GetNextCurve() ;
}
}
// calcolo gli angoli tra le diverse entità
// calcolo gli angoli tra le diverse entità
DBLVECTOR vAngs ;
{
vAngs.push_back( 0) ;
@@ -230,7 +232,7 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
vAngs.push_back( 0) ;
}
// primo passo : estraggo entità dalla copia, loro offset elementare e aggiunta raccordi esterni (sempre fillet)
// primo passo : estraggo entità dalla copia, loro offset elementare e aggiunta raccordi esterni (sempre fillet)
CurveComposite ccCopy2 ;
if ( ! ccCopy2.CopyFrom( &ccCopy))
return false ;
@@ -285,9 +287,9 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
// se originale chiuso, devo confrontare anche ultima e prima curva
if ( bClosed && m_CrvLst.size() >= 2) {
// la curva precedente è l'ultima dell'offset
// la curva precedente è l'ultima dell'offset
ICurve* pCrv1 = m_CrvLst.back() ;
// la curva successiva ora è la prima dell'offset
// la curva successiva ora è la prima dell'offset
ICurve* pCrv2 = m_CrvLst.front() ;
// verifico relazione con la curva precedente e aggiungo eventuali curve intermedie
CurveComposite ccTemp ;
@@ -334,7 +336,7 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
bool bNextInt = NextIsLine( iIter, m_CrvLst, bClosed) &&
NextIsLonger( nInd1, vLens, bClosed) &&
( ( dDist < 0 && vAngs[nInd1] > 0) || ( dDist > 0 && vAngs[nInd1] < 0)) ;
// calcolo la massima estensione di offset (Voronoi con entità adiacenti)
// calcolo la massima estensione di offset (Voronoi con entità adiacenti)
double dMaxDist = INFINITO ;
if ( bPrevInt && bNextInt) {
double dTgA = tan( 0.5 * ( ANG_STRAIGHT - abs( vAngs[nInd1-1])) * DEGTORAD) ;
@@ -502,7 +504,7 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
// sesto passo : se curva aperta, elimino i tratti che stanno nella circonferenza di offset dei punti estremi
if ( ! bClosed) {
// ciconferenza sull'estremità iniziale
// ciconferenza sull'estremità iniziale
Point3d ptStart ; ccCopy.GetStartPoint( ptStart) ;
PtrOwner<CurveArc> pCircS( CreateBasicCurveArc()) ;
if ( IsNull( pCircS) || ! pCircS->Set( ptStart, Z_AX, abs( dDist)))
@@ -551,7 +553,7 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
// passo alla successiva
++ iIter ;
}
// circonferenza sull'estremità finale
// circonferenza sull'estremità finale
Point3d ptEnd ; ccCopy.GetEndPoint( ptEnd) ;
PtrOwner<CurveArc> pCircE( CreateBasicCurveArc()) ;
if ( IsNull( pCircE) || ! pCircE->Set( ptEnd, Z_AX, abs( dDist)))
@@ -672,12 +674,20 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
}
// nono passo : se con smusso o estensione, sostituisco i fillet con questi
// NB questa parte non è gestita in modo efficiente perchè dovrebbe essere sempre disabilitata.
// Le funzioni sono state ottimizzate per lavorare con voronoi
if ( ( nType & ICurve::OFF_CHAMFER) != 0 || ( nType & ICurve::OFF_EXTEND) != 0) {
for ( auto iIter = m_CrvLst.begin() ; iIter != m_CrvLst.end() ; ++ iIter) {
CurveComposite* pCrvCo = GetBasicCurveComposite( *iIter) ;
IdentifyFillets( pCrvCo, dDist) ;
AdjustCurveFillets( pCrvCo, dDist, nType) ;
}
ICURVEPOVECTOR vCrvs ;
vCrvs.reserve( m_CrvLst.size()) ;
for ( auto pCrv : m_CrvLst) {
IdentifyFillets( GetCurveComposite( pCrv), dDist) ;
vCrvs.emplace_back( pCrv) ;
}
if ( ! AdjustCurveFillets( vCrvs, dDist, nType))
return false ;
m_CrvLst.clear() ;
for ( int j = 0 ; j < int( vCrvs.size()) ; j ++)
m_CrvLst.emplace_back( Release( vCrvs[j])) ;
}
}
@@ -697,6 +707,27 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
// calcolo offset con Voronoi
ICURVEPOVECTOR vOffs ;
voronoiObj->CalcOffset( vOffs, dDist, nType) ;
if ( vOffs.empty()) {
// se non ho ottenuto offset e sono circa al valore limite ritento con valore leggermente diverso per le tolleranze di vroni
double dMaxOffs ;
if ( ! pCrv->IsClosed() || ( voronoiObj->CalcLimitOffset( 0, dDist < 0, dMaxOffs) && abs( dMaxOffs - abs( dDist)) < EPS_SMALL)) {
double dCorr = ( dDist > 0 ? - VRONI_OFFS_TOL : VRONI_OFFS_TOL) ;
voronoiObj->CalcOffset( vOffs, dDist + dCorr, nType) ;
}
// se ancora vuoto calcolo i punti speciali di offset ( punti e direzioni sui bisettore alla distanza richiesta)
if ( vOffs.empty()) {
PNTVECTVECTOR vPntOffs ;
voronoiObj->CalcSpecialPointOffset( vPntOffs, dDist) ;
// NB al momento vengono gestiti solo i casi in cui vi è un unico punto di offset. Se si ottengono più punti di offset
// ( e.g. alcune curve aperte) non se ne restiusce nessuno. Da estendere, se necessario, individuando i punti dal lato
// di offset richiesto
if ( vPntOffs.size() == 1) {
m_ptOffs = vPntOffs[0].first ;
m_vtOut = vPntOffs[0].second ;
}
}
}
for ( int i = 0 ; i < ( int)vOffs.size() ; i ++)
m_CrvLst.emplace_back( Release( vOffs[i])) ;
@@ -724,10 +755,21 @@ OffsetCurve::Make( const ICurve* pCrv, double dDist, int nType)
pCrv->Scale( GLOB_FRM, 1 / dExtrOnN, 1, 1) ;
pCrv->ToGlob( frCopy) ;
}
if ( m_ptOffs.IsValid()) {
m_ptOffs.Scale( GLOB_FRM, 1 / dExtrOnN, 1, 1) ;
m_ptOffs.ToGlob( frCopy) ;
m_vtOut.Scale( GLOB_FRM, 1 / dExtrOnN, 1, 1) ;
m_vtOut.ToGlob( frCopy) ;
}
}
else if ( bNeedRef) {
for ( auto pCrv : m_CrvLst)
pCrv->ToGlob( frCopy) ;
if ( m_ptOffs.IsValid()) {
m_ptOffs.ToGlob( frCopy) ;
m_vtOut.ToGlob( frCopy) ;
}
}
// assegno estrusione e spessore come curva originale e unisco parti allineate
@@ -805,6 +847,20 @@ OffsetCurve::GetShorterCurve( void)
return pCrv ;
}
//----------------------------------------------------------------------------
bool
OffsetCurve::GetPointOffset( Point3d& ptOffs, Vector3d& vtOut)
{
// verifico se valori validi da restituire
if ( ! m_ptOffs.IsValid() || ! m_vtOut.IsValid())
return false ;
ptOffs = m_ptOffs ;
vtOut = m_vtOut ;
return true ;
}
//----------------------------------------------------------------------------
bool
PreviousIsLine( ICURVEPLIST::const_iterator iIter, const ICURVEPLIST& CrvLst, bool bClosed)
@@ -817,7 +873,7 @@ PreviousIsLine( ICURVEPLIST::const_iterator iIter, const ICURVEPLIST& CrvLst, bo
// se non esiste e curva chiusa prendo l'ultimo
if ( iPrev == CrvLst.end() && bClosed)
-- iPrev ;
// se non esiste o non è una linea, test fallito
// se non esiste o non è una linea, test fallito
if ( iPrev == CrvLst.end() || (*iPrev)->GetType() != CRV_LINE )
return false ;
// test superato
@@ -830,7 +886,7 @@ PreviousIsLonger( int nInd1, const DBLVECTOR& vLens, bool bClosed)
{
// massimo indice nel vettore
int nMax = int( vLens.size()) - 1 ;
// verifico validità indice (questo indice è incrementato di 1)
// verifico validità indice (questo indice è incrementato di 1)
if ( nInd1 < 1 || nInd1 > nMax + 1)
return false ;
// indice del precedente nel vettore di lunghezze
@@ -854,7 +910,7 @@ NextIsLine( ICURVEPLIST::const_iterator iIter, const ICURVEPLIST& CrvLst, bool b
// se non esiste e curva chiusa prendo il primo
if ( iNext == CrvLst.end() && bClosed)
iNext = CrvLst.begin() ;
// se non esiste o non è una linea, test fallito
// se non esiste o non è una linea, test fallito
if ( iNext == CrvLst.end() || (*iNext)->GetType() != CRV_LINE )
return false ;
// test superato
@@ -867,7 +923,7 @@ NextIsLonger( int nInd1, const DBLVECTOR& vLens, bool bClosed)
{
// massimo indice nel vettore
int nMax = int( vLens.size()) - 1 ;
// verifico validità indice (questo indice è incrementato di 1)
// verifico validità indice (questo indice è incrementato di 1)
if ( nInd1 < 1 || nInd1 > nMax + 1)
return false ;
// indice del successivo nel vettore di lunghezze
@@ -946,7 +1002,7 @@ VerifyAndAdjustSamePoint( ICurve* pCrv1, ICurve* pCrv2, int& nRes)
nRes = 4 ;
return true ;
}
// se coincidono esattamente, va bene così
// se coincidono esattamente, va bene così
if ( AreSamePointExact( ptP1, ptP2)) {
nRes = 0 ;
return true ;
@@ -976,7 +1032,7 @@ VerifyAndAdjustInternalAngle( ICurve* pCrv1, ICurve* pCrv2, int& nRes)
IntersCurveCurve intCC( *pCrv1, *pCrv2) ;
if ( intCC.GetIntersCount() == 0)
return false ;
// prendo l'intersezione più vicina al punto medio tra gli estremi delle curve
// prendo l'intersezione più vicina al punto medio tra gli estremi delle curve
Point3d ptP1, ptP2 ;
if ( ! pCrv1->GetEndPoint( ptP1) || ! pCrv2->GetStartPoint( ptP2))
return false ;
@@ -1024,7 +1080,7 @@ VerifyAndAdjustExternalAngle( ICurve* pCrv1, ICurve* pCrv2, double dAngDeg, doub
vtDir2.Invert() ;
}
// verifico sia angolo esterno (accetto se entità quasi esattamente sovrapposte)
// verifico sia angolo esterno (accetto se entità quasi esattamente sovrapposte)
if ( abs( dAngDeg) < ( ANG_STRAIGHT - 10 * EPS_ANG_ZERO) &&
( ( dDist < 0 && dAngDeg > 0) ||
( dDist > 0 && dAngDeg < 0)))
@@ -1066,7 +1122,7 @@ VerifyAndAdjustExternalAngle( ICurve* pCrv1, ICurve* pCrv2, double dAngDeg, doub
return false ;
ptP1a = ptP1 + vtDir1 * dLen ;
ptP2a = ptP2 - vtDir2 * dLen ;
// se prima c'è linea posso allungarla
// se prima c'è linea posso allungarla
if ( pCrv1->GetType() == CRV_LINE)
pCrv1->ModifyEnd( ptP1a) ;
// altrimenti, devo aggiungere una nuova linea
@@ -1085,7 +1141,7 @@ VerifyAndAdjustExternalAngle( ICurve* pCrv1, ICurve* pCrv2, double dAngDeg, doub
if ( ! ccAux.AddCurve( Release( pCrv)))
return false ;
}
// se dopo c'è linea posso allungarla
// se dopo c'è linea posso allungarla
if ( pCrv2->GetType() == CRV_LINE)
pCrv2->ModifyStart( ptP2a) ;
// altrimenti, devo aggiungere una nuova linea
@@ -1108,7 +1164,7 @@ VerifyAndAdjustExternalAngle( ICurve* pCrv1, ICurve* pCrv2, double dAngDeg, doub
if ( ! pCrv1->GetEndPoint( ptP1) || ! pCrv2->GetStartPoint( ptP2))
return false ;
ptPc = ptP1 + vtDir1 * dLen ;
// se prima c'è linea o angolo molto piccolo posso allungarla
// se prima c'è linea o angolo molto piccolo posso allungarla
if ( ( pCrv1->GetType() == CRV_LINE) || bAngSmall)
pCrv1->ModifyEnd( ptPc) ;
// altrimenti, devo aggiungere una nuova linea
@@ -1119,7 +1175,7 @@ VerifyAndAdjustExternalAngle( ICurve* pCrv1, ICurve* pCrv2, double dAngDeg, doub
if ( ! ccAux.AddCurve( Release( pCrv)))
return false ;
}
// se dopo c'è linea o angolo molto piccolo posso allungarla
// se dopo c'è linea o angolo molto piccolo posso allungarla
if ( ( pCrv2->GetType() == CRV_LINE) || bAngSmall)
pCrv2->ModifyStart( ptPc) ;
// altrimenti, devo aggiungere una nuova linea
+2 -2
View File
@@ -195,7 +195,7 @@ PointGrid3d::Find( const Point3d& ptTest, double dTol, INTVECTOR& vnIds) const
}
}
return ( vnIds.size() > 0) ;
return ( ! vnIds.empty()) ;
}
//----------------------------------------------------------------------------
@@ -221,7 +221,7 @@ PointGrid3d::Find( const BBox3d& b3Test, INTVECTOR& vnIds) const
}
}
return ( vnIds.size() > 0) ;
return ( ! vnIds.empty()) ;
}
//----------------------------------------------------------------------------
+41 -31
View File
@@ -14,36 +14,28 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "PointsPCA.h"
#include "/EgtDev/Extern/Eigen/Dense"
//----------------------------------------------------------------------------
PointsPCA::PointsPCA( void)
{
// azzero numero punti
m_dTotW = 0 ;
// azzero il baricentro
m_ptCen.Set( 0, 0, 0) ;
// azzero matrice di covarianza
m_CovMat.setZero() ;
// inizializzo il rank ad un valore assurdo
m_nRank = - 1 ;
// inizializzo baricentro
m_ptCen.Set( 0, 0, 0) ;
// inizializzo il peso totale
m_dTotW = 0 ;
// riservo memoria per la matrice di punti e pesi
m_vPntW.reserve( 128) ;
}
//----------------------------------------------------------------------------
void
PointsPCA::AddPoint( const Point3d& ptP, double dW)
{
// incremento numero punti
m_dTotW += dW ;
// aggiorno il baricentro
m_ptCen += dW * ptP ;
// aggiorno la matrice di covarianza (solo triangolo superiore perchč simmetrica)
m_CovMat(0,0) += dW * ( ptP.x * ptP.x) ;
m_CovMat(1,1) += dW * ( ptP.y * ptP.y) ;
m_CovMat(2,2) += dW * ( ptP.z * ptP.z) ;
m_CovMat(0,1) += dW * ( ptP.x * ptP.y) ;
m_CovMat(0,2) += dW * ( ptP.x * ptP.z) ;
m_CovMat(1,2) += dW * ( ptP.y * ptP.z) ;
// salvo i dati
m_vPntW.emplace_back( ptP, dW) ;
}
//----------------------------------------------------------------------------
@@ -58,29 +50,47 @@ PointsPCA::Finalize( void)
m_nRank = 0 ;
// se non sono stati assegnati punti, esco
if ( m_dTotW < EPS_ZERO)
if ( m_vPntW.empty())
return false ;
// fattore di scala per numero di punti
// calcolo del peso totale
for ( const auto& PntW : m_vPntW)
m_dTotW += PntW.second ;
if ( m_dTotW < EPS_ZERO)
return false ;
// fattore di scala
double dScale = 1 / m_dTotW ;
// calcolo del baricentro
for ( const auto& PntW : m_vPntW)
m_ptCen += PntW.second * PntW.first ;
m_ptCen *= dScale ;
// completo la matrice di covarianza
m_CovMat(0,0) = m_CovMat(0,0) * dScale - m_ptCen.x * m_ptCen.x ;
m_CovMat(1,1) = m_CovMat(1,1) * dScale - m_ptCen.y * m_ptCen.y ;
m_CovMat(2,2) = m_CovMat(2,2) * dScale - m_ptCen.z * m_ptCen.z ;
m_CovMat(0,1) = m_CovMat(0,1) * dScale - m_ptCen.x * m_ptCen.y ;
m_CovMat(0,2) = m_CovMat(0,2) * dScale - m_ptCen.x * m_ptCen.z ;
m_CovMat(1,2) = m_CovMat(1,2) * dScale - m_ptCen.y * m_ptCen.z ;
m_CovMat(1,0) = m_CovMat(0,1) ;
m_CovMat(2,0) = m_CovMat(0,2) ;
m_CovMat(2,1) = m_CovMat(1,2) ;
// matrice di covarianza
Eigen::Matrix3d CovMat ;
CovMat.setZero() ;
for ( const auto& PntW : m_vPntW) {
Point3d ptP( PntW.first.x - m_ptCen.x, PntW.first.y - m_ptCen.y, PntW.first.z - m_ptCen.z) ;
CovMat(0,0) += PntW.second * ( ptP.x * ptP.x) ;
CovMat(1,1) += PntW.second * ( ptP.y * ptP.y) ;
CovMat(2,2) += PntW.second * ( ptP.z * ptP.z) ;
CovMat(0,1) += PntW.second * ( ptP.x * ptP.y) ;
CovMat(0,2) += PntW.second * ( ptP.x * ptP.z) ;
CovMat(1,2) += PntW.second * ( ptP.y * ptP.z) ;
}
CovMat(0,0) = CovMat(0,0) * dScale ;
CovMat(1,1) = CovMat(1,1) * dScale ;
CovMat(2,2) = CovMat(2,2) * dScale ;
CovMat(0,1) = CovMat(0,1) * dScale ;
CovMat(0,2) = CovMat(0,2) * dScale ;
CovMat(1,2) = CovMat(1,2) * dScale ;
CovMat(1,0) = CovMat(0,1) ;
CovMat(2,0) = CovMat(0,2) ;
CovMat(2,1) = CovMat(1,2) ;
// calcolo gli autovalori e autovettori (essendo matrice 3x3 uso metodo diretto)
// calcolo gli autovalori e autovettori
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> es ;
es.compute( m_CovMat) ; // non usare computeDirect : errore nell'ordine degli autovettori
es.compute( CovMat) ; // non usare computeDirect : errore nell'ordine degli autovettori
if ( es.info() == Eigen::NoConvergence)
return false ;
+3 -4
View File
@@ -13,8 +13,7 @@
#pragma once
#include "/EgtDev/Include/EGkPoint3d.h"
#include "/EgtDev/Extern/Eigen/Dense"
#include "/EgtDev/Include/EGkGeoCollection.h"
//----------------------------------------------------------------------------
class PointsPCA
@@ -33,9 +32,9 @@ class PointsPCA
static const int MAX_RANK = 3 ;
private :
double m_dTotW ; // peso totale (se pesi tutti unitari, allora è numero punti)
PNTUVECTOR m_vPntW ; // vettore dei punti con i loro pesi
Point3d m_ptCen ; // baricentro
Eigen::Matrix3d m_CovMat ; // matrice di covarianza
double m_dTotW ; // peso totale
int m_nRank ; // numero delle componenti principali (MAX_RANK = 3)
Vector3d m_vtPC[MAX_RANK] ; // direzioni delle componenti principali
} ;
+4 -4
View File
@@ -13,9 +13,9 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "DistPointLine.h"
#include "GeoConst.h"
#include "CurveArc.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGkPolyArc.h"
#include "/EgtDev/Include/EGkFrame3d.h"
#include <algorithm>
@@ -62,7 +62,7 @@ bool
PolyArc::AddUPoint( double dPar, const Point3d& ptP, double dBulge)
{
// se il punto è uguale al precedente (ignoro parametro e bulge), non lo inserisco ma ok
if ( m_lUPointBs.size() > 0 && AreSamePointApprox( ptP, m_lUPointBs.back().ptP)) {
if ( ! m_lUPointBs.empty() && AreSamePointApprox( ptP, m_lUPointBs.back().ptP)) {
// assegno parametro e bulge
m_lUPointBs.back().dU = dPar ;
m_lUPointBs.back().dB = dBulge ;
@@ -285,10 +285,10 @@ bool
PolyArc::Join( PolyArc& PA, double dOffsetPar)
{
// se l'altro poliarco non contiene alcunchè, esco con ok
if ( PA.m_lUPointBs.size() == 0)
if ( PA.m_lUPointBs.empty())
return true ;
// verifico che l'ultimo punto di questo poliarco coincida con il primo dell'altro
if ( m_lUPointBs.size() > 0 && ! AreSamePointApprox( m_lUPointBs.back().ptP, PA.m_lUPointBs.front().ptP))
if ( ! m_lUPointBs.empty() && ! AreSamePointApprox( m_lUPointBs.back().ptP, PA.m_lUPointBs.front().ptP))
return false ;
// cancello l'ultimo di questo
EraseLastUPoint() ;
+448 -89
View File
@@ -1,4 +1,4 @@
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
// EgalTech 2013-2013
//----------------------------------------------------------------------------
// File : PolyLine.cpp Data : 22.12.13 Versione : 1.4l3
@@ -14,13 +14,15 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "CurveLine.h"
#include "DistPointLine.h"
#include "IntersLineLine.h"
#include "PolygonPlane.h"
#include "PointsPCA.h"
#include "GeoConst.h"
#include "CurveComposite.h"
#include "/EgtDev/Include/EGkDistPointCurve.h"
#include "/EgtDev/Include/EGkPolyLine.h"
#include "/EgtDev/Include/EGkPlane3d.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGnStringUtils.h"
#include "/EgtDev/Include/EgtNumUtils.h"
@@ -53,8 +55,8 @@ PolyLine::AddUPoint( double dPar, const Point3d& ptP, bool bEndOrStart)
{
// se da aggiungere in coda
if ( bEndOrStart) {
// se il punto è uguale all'ultimo (ignoro parametro), non lo inserisco ma ok
if ( m_lUPoints.size() > 0 && AreSamePointApprox( ptP, m_lUPoints.back().first)) {
// se il punto è uguale all'ultimo (ignoro parametro), non lo inserisco ma ok
if ( ! m_lUPoints.empty() && AreSamePointApprox( ptP, m_lUPoints.back().first)) {
++ m_nRejected ;
return true ;
}
@@ -68,8 +70,8 @@ PolyLine::AddUPoint( double dPar, const Point3d& ptP, bool bEndOrStart)
}
// altrimenti si aggiunge in testa
else {
// se il punto è uguale al primo (ignoro parametro), non lo inserisco ma ok
if ( m_lUPoints.size() > 0 && AreSamePointApprox( ptP, m_lUPoints.front().first)) {
// se il punto è uguale al primo (ignoro parametro), non lo inserisco ma ok
if ( ! m_lUPoints.empty() && AreSamePointApprox( ptP, m_lUPoints.front().first)) {
++ m_nRejected ;
return true ;
}
@@ -92,7 +94,7 @@ PolyLine::Close( void)
// ci devono essere almeno 2 punti
if ( m_lUPoints.size() < 2)
return false ;
// verifico non sia già chiuso
// verifico non sia già chiuso
if ( AreSamePointApprox( m_lUPoints.front().first, m_lUPoints.back().first))
return false ;
// aggiungo un punto uguale al primo in coda
@@ -219,7 +221,7 @@ PolyLine::ToLoc( const Frame3d& frRef)
bool
PolyLine::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
{
// se i due riferimenti coincidono, non devo fare alcunché
// se i due riferimenti coincidono, non devo fare alcunché
if ( AreSameFrame( frOri, frDest))
return true ;
// ciclo sui punti
@@ -233,11 +235,11 @@ PolyLine::LocToLoc( const Frame3d& frOri, const Frame3d& frDest)
bool
PolyLine::Join( PolyLine& PL, double dOffsetPar)
{
// se l'altra polilinea non contiene alcunchè, esco con ok
if ( PL.m_lUPoints.size() == 0)
// se l'altra polilinea non contiene alcunchè, esco con ok
if ( PL.m_lUPoints.empty())
return true ;
// verifico che l'ultimo punto di questa polilinea coincida con il primo dell'altra
if ( m_lUPoints.size() > 0 && ! AreSamePointApprox( m_lUPoints.back().first, PL.m_lUPoints.front().first))
if ( ! m_lUPoints.empty() && ! AreSamePointApprox( m_lUPoints.back().first, PL.m_lUPoints.front().first))
return false ;
// cancello l'ultimo di questa
EraseLastUPoint() ;
@@ -385,7 +387,7 @@ PolyLine::GetPrevUPoint( double* pdPar, Point3d* pptP, bool bNotFirst) const
bool
PolyLine::GetCurrUPoint( double* pdPar, Point3d* pptP) const
{
// verifico validità punto corrente
// verifico validità punto corrente
if ( m_iter == m_lUPoints.end())
return false ;
@@ -426,7 +428,7 @@ PolyLine::GetFirstULine( double* pdIni, Point3d* pptIni, double* pdFin, Point3d*
bool
PolyLine::GetNextULine( double* pdIni, Point3d* pptIni, double* pdFin, Point3d* pptFin) const
{
// parametro e punto iniziali (è il precedente finale)
// parametro e punto iniziali (è il precedente finale)
if ( m_iter == m_lUPoints.end())
return false ;
if ( pdIni != nullptr)
@@ -510,19 +512,19 @@ PolyLine::IsFlat( int& nRank, Point3d& ptCen, Vector3d& vtDir, double dToler) co
ptsPCA.AddPoint( Media( ptP1, ptP2, 0.25), dLen / 2) ;
ptsPCA.AddPoint( Media( ptP1, ptP2, 0.75), dLen / 2) ;
}
// recupero il rango, ovvero la dimensionalità dell'insieme di punti
// recupero il rango, ovvero la dimensionalità dell'insieme di punti
nRank = ptsPCA.GetRank() ;
// se dimensione nulla, o non ci sono punti o sono tutti praticamente coincidenti
if ( nRank == 0)
return ptsPCA.GetCenter( ptCen) ;
// se dimensione 1, allora i punti sono distribuiti su una linea
if ( nRank == 1) {
// assegno il centro e la direzione della linea (il verso è indifferente)
// assegno il centro e la direzione della linea (il verso è indifferente)
ptsPCA.GetCenter( ptCen) ;
ptsPCA.GetPrincipalComponent( 0, vtDir) ;
return true ;
}
// altrimenti dimensione 2 o 3, allora è determinato un piano principale, verifico se tutti i punti vi giacciono
// altrimenti dimensione 2 o 3, allora è determinato un piano principale, verifico se tutti i punti vi giacciono
// Center and normal vector
ptsPCA.GetCenter( ptCen) ;
Vector3d vtX, vtY ;
@@ -530,9 +532,9 @@ PolyLine::IsFlat( int& nRank, Point3d& ptCen, Vector3d& vtDir, double dToler) co
ptsPCA.GetPrincipalComponent( 1, vtY) ;
vtDir = vtX ^ vtY ;
if ( ! vtDir.Normalize()) {
// riduco la dimensionalità a lineare
// riduco la dimensionalità a lineare
nRank = 1 ;
// assegno il centro e la direzione della linea (il verso è indifferente)
// assegno il centro e la direzione della linea (il verso è indifferente)
ptsPCA.GetCenter( ptCen) ;
vtDir = vtX ;
return true ;
@@ -561,12 +563,12 @@ PolyLine::IsFlat( Plane3d& plPlane, double dToler) const
plPlane.Reset() ;
return false ;
}
// recupero dati sulla planarità della polilinea
// recupero dati sulla planarità della polilinea
int nRank ;
Point3d ptCen ;
Vector3d vtDir ;
bool bFlat = IsFlat( nRank, ptCen, vtDir, dToler) ;
// imposto il piano a seconda della dimensionalità
// imposto il piano a seconda della dimensionalità
switch ( nRank) {
case 0 : // punto
plPlane.Set( ptCen, Z_AX) ;
@@ -587,18 +589,29 @@ PolyLine::IsClosedAndFlat( Plane3d& plPlane, double& dArea, double dToler) const
// Test if closed
if ( ! IsClosed())
return false ;
// Compute a representative plane for the polygon
Point3d ptP ;
// Calcolo il centro (per minimizzare gli errori nelle successive operazioni)
Point3d ptCen = ORIG ;
int nCount = 0 ;
for ( bool bFound = GetFirstPoint( ptP) ; bFound ; bFound = GetNextPoint( ptP)) {
ptCen += ptP ;
++ nCount ;
}
ptCen /= nCount ;
Vector3d vtMove = ptCen - ORIG ;
// Compute a representative plane for the polygon (faccio il calcolo nel centro e poi traslo al contrario il piano)
PolygonPlane PolyPlane ;
for ( bool bFound = GetFirstPoint( ptP) ; bFound ; bFound = GetNextPoint( ptP))
PolyPlane.AddPoint( ptP) ;
PolyPlane.AddPoint( ptP - vtMove) ;
if ( ! PolyPlane.GetPlane( plPlane) || ! PolyPlane.GetArea( dArea)) {
dArea = 0 ;
return IsFlat( plPlane, dToler) ;
}
plPlane.Translate( vtMove) ;
// Sistemo il piano per l'offset utilizzato
// Test each vertex to see if it is farther from plane than allowed max distance
for ( bool bFound = GetFirstPoint( ptP) ; bFound ; bFound = GetNextPoint( ptP)) {
double dDist = ( ( ptP - ORIG) * plPlane.GetVersN()) - plPlane.GetDist() ;
double dDist = DistPointPlane( ptP, plPlane) ;
if ( abs( dDist) > dToler)
return false ;
}
@@ -639,13 +652,13 @@ PolyLine::GetAreaXY( double& dArea) const
// verifico sia chiusa
if ( ! IsClosed())
return false ;
// calcolo l'area considerando solo XY (è la Z di Newell)
// calcolo l'area considerando solo XY (è la Z di Newell)
dArea = 0 ;
Point3d ptIni, ptFin ;
for ( bool bFound = GetFirstLine( ptIni, ptFin) ; bFound ; bFound = GetNextLine( ptIni, ptFin)) {
dArea += ( ptIni.x - ptFin.x) * ( ptIni.y + ptFin.y) ; // projection on xy
}
// considero anche la linea tra l'ultimo e il primo punto perchè in alcuni casi potrebbero definire area
// considero anche la linea tra l'ultimo e il primo punto perchè in alcuni casi potrebbero definire area
// significativa anche se sono coincidenti per le nostre tolleranze
ptIni = ptFin ;
GetFirstPoint( ptFin) ;
@@ -746,7 +759,7 @@ DouglasPeuckerSimplification( const PNTUVECTOR& vPtU, const double dSqTol, const
}
}
// se la distanza massima trovata è sopra la tolleranza, allora controllo la parte di PolyLine tra
// se la distanza massima trovata è sopra la tolleranza, allora controllo la parte di PolyLine tra
// (nIndStart, nMaxInd) e quella tra (nMaxInd, nIndEnd)
if ( dMaxSqDist > dSqTol) {
// inserisco il punto
@@ -785,11 +798,11 @@ PolyLine::RemoveAlignedPoints( double dToler)
vInd.push_back( 0) ;
if ( ! DouglasPeuckerSimplification( vPtU, dSqTol, 0, int( vPtU.size()) - 1, vInd))
return false ;
vInd.push_back( vPtU.size() - 1) ;
vInd.push_back( int( vPtU.size()) - 1) ;
}
// altrimenti chiusa
else {
// cerco il punto più distante dal primo
// cerco il punto più distante dal primo
double dMaxDist = 0. ;
int nMaxInd = 0 ;
for ( int i = 1 ; i < int( vPtU.size()) ; ++ i) {
@@ -806,12 +819,20 @@ PolyLine::RemoveAlignedPoints( double dToler)
vInd.push_back( nMaxInd) ;
if ( ! DouglasPeuckerSimplification( vPtU, dSqTol, nMaxInd, int( vPtU.size()) - 1, vInd))
return false ;
vInd.push_back( vPtU.size() - 1) ;
vInd.push_back( int( vPtU.size()) - 1) ;
}
// ordino in senso crescente
sort( vInd.begin(), vInd.end()) ;
// se chiusa e almeno 4 punti rimasti, controllo allineamento dell'inizio con precedente e successivo rimasti
if ( IsClosed() && vInd.size() >= 4) {
if ( DistPointLine( vPtU[vInd[0]].first, vPtU[vInd[1]].first, vPtU[vInd[int(vInd.size())-2]].first).IsEpsilon( dToler)) {
vInd.erase( vInd.begin()) ;
vInd.back() = vInd.front() ;
}
}
// rimetto in lista i soli punti rimasti
m_lUPoints.clear() ;
for ( auto Ind : vInd)
@@ -958,7 +979,7 @@ PolyLine::MyApproxOnSide( const Vector3d& vtN, bool bLeftSide, double dToler)
}
}
}
// non è stato eliminato alcunché
// non è stato eliminato alcunché
// ripristino la tolleranza corrente
dCurrToler = dToler ;
// avanzo il terzetto di uno step
@@ -999,7 +1020,7 @@ PolyLine::MakeConvex( const Vector3d& vtN, bool bLeftSide)
bool
PolyLine::MyMakeConvex( const Vector3d& vtN, bool bLeftSide)
{
// ciclo i controlli finchè non ci sono rimozioni
// ciclo i controlli finchè non ci sono rimozioni
bool bRemoved = true ;
while ( bRemoved) {
bRemoved = false ;
@@ -1027,7 +1048,7 @@ PolyLine::MyMakeConvex( const Vector3d& vtN, bool bLeftSide)
bRemoved = true ;
continue ;
}
// non è stato eliminato alcunché : avanzo il terzetto di uno step
// non è stato eliminato alcunché : avanzo il terzetto di uno step
precP = currP ;
currP = nextP ;
++ nextP ;
@@ -1054,7 +1075,7 @@ PolyLine::Invert( bool bInvertU)
m_lUPoints.reverse() ;
// se richiesto, inverto anche il parametro U
if ( bInvertU) {
// recupero il primo valore di U che è il vecchio finale ed è il riferimento di inversione
// recupero il primo valore di U che è il vecchio finale ed è il riferimento di inversione
double dUfin = m_lUPoints.front().second ;
// ciclo su tutti gli elementi
for ( auto& UPoint : m_lUPoints) {
@@ -1064,6 +1085,35 @@ PolyLine::Invert( bool bInvertU)
return true ;
}
//----------------------------------------------------------------------------
bool
PolyLine::MyRemoveSamePoints( double dToler)
{
// elimino i punti consecutivi diventati coincidenti (almeno 2)
if ( m_lUPoints.size() < 2)
return true ;
// punto precedente
auto precP = m_lUPoints.begin() ;
// punto corrente
auto currP = next( precP) ;
// mentre esiste un corrente
while ( currP != m_lUPoints.end()) {
// se coincidono
if ( AreSamePointEpsilon( precP->first, currP->first, dToler)) {
// elimino il punto corrente
currP = m_lUPoints.erase( currP) ;
// il precedente rimane inalterato
}
// altrimenti da tenere
else {
// avanzo la coppia di uno step
precP = currP ;
++ currP ;
}
}
return true ;
}
//----------------------------------------------------------------------------
bool
PolyLine::Flatten( double dZ)
@@ -1072,31 +1122,39 @@ PolyLine::Flatten( double dZ)
if ( m_lUPoints.empty())
return true ;
// ciclo su tutti gli elementi per portarli alla Z indicata
for ( auto& UPoint : m_lUPoints) {
for ( auto& UPoint : m_lUPoints)
UPoint.first.z = dZ ;
}
// elimino i punti consecutivi diventati coincidenti (almeno 2)
if ( m_lUPoints.size() < 2)
// elimino i punti consecutivi diventati coincidenti
MyRemoveSamePoints() ;
return true ;
}
//----------------------------------------------------------------------------
bool
PolyLine::FlattenInAutoPlane( double dToler)
{
// verifico non sia vuota
if ( m_lUPoints.empty())
return true ;
// punto precedente
auto precP = m_lUPoints.begin() ;
// punto corrente
auto currP = next( precP) ;
// mentre esiste un corrente
while ( currP != m_lUPoints.end()) {
// se coincidono
if ( AreSamePointApprox( precP->first, currP->first)) {
// elimino il punto corrente
currP = m_lUPoints.erase( currP) ;
// il precedente rimane inalterato
}
// altrimenti da tenere
else {
// avanzo la coppia di uno step
precP = currP ;
++ currP ;
}
}
// recupero dati sulla planarità della polilinea
int nRank ;
Point3d ptCen ;
Vector3d vtDir ;
bool bFlat = IsFlat( nRank, ptCen, vtDir, dToler) ;
// se non planare entro la tolleranza, esco
if ( ! bFlat)
return false ;
// se punto o linea, non devo fare alcunché
if ( nRank == 0 || nRank == 1)
return true ;
// assegno il piano medio
Plane3d plPlane ;
plPlane.Set( ptCen, vtDir) ;
// proietto i punti su questo piano
for ( auto& UPoint : m_lUPoints)
UPoint.first = ProjectPointOnPlane( UPoint.first, plPlane) ;
// elimino i punti consecutivi diventati coincidenti
MyRemoveSamePoints() ;
return true ;
}
@@ -1269,8 +1327,8 @@ PolyLine::GetMinAreaRectangleXY( Point3d& ptCen, Vector3d& vtAx, double& dLen, d
bool
PolyLine::Trim( const Plane3d& plPlane, bool bInVsOut)
{
// se vuota non faccio alcunché
if ( m_lUPoints.size() == 0)
// se vuota non faccio alcunché
if ( m_lUPoints.empty())
return false ;
// determino le intersezioni dei lati con il piano
@@ -1371,7 +1429,7 @@ IsPointInsidePolyLine( const Point3d& ptP, const PolyLine& plPoly, double dToler
return false ;
// Riferimento alla lista dei punti
PNTULIST& List = const_cast<PolyLine&>( plPoly).GetUPointList() ;
// Ciclo sui segmenti della polilinea per cercare il segmento più vicino al punto
// Ciclo sui segmenti della polilinea per cercare il segmento più vicino al punto
double dMinSqDist = SQ_INFINITO ;
Point3d ptMinDist ;
auto itMinDistEnd = List.end() ;
@@ -1389,7 +1447,7 @@ IsPointInsidePolyLine( const Point3d& ptP, const PolyLine& plPoly, double dToler
}
// Determino tangente di riferimento
Vector3d vtTang ;
// se minima distanza nell'estremo iniziale del segmento
// se minima distanza nell'estremo iniziale del segmento
if ( AreSamePointApprox( ptMinDist, prev( itMinDistEnd)->first)) {
// direzione del segmento
Vector3d vtCurrTg = itMinDistEnd->first - prev( itMinDistEnd)->first ;
@@ -1405,7 +1463,7 @@ IsPointInsidePolyLine( const Point3d& ptP, const PolyLine& plPoly, double dToler
vtTang = vtPrevTg + vtCurrTg ;
vtTang.Normalize() ;
}
// se altrimenti minima distanza nell'estremo finale del segmento
// se altrimenti minima distanza nell'estremo finale del segmento
else if ( AreSamePointApprox( ptMinDist, itMinDistEnd->first)) {
// direzione del segmento
Vector3d vtCurrTg = itMinDistEnd->first - prev( itMinDistEnd)->first ;
@@ -1421,7 +1479,7 @@ IsPointInsidePolyLine( const Point3d& ptP, const PolyLine& plPoly, double dToler
vtTang = vtCurrTg + vtNextTg ;
vtTang.Normalize() ;
}
// altrimenti minima distanza con l'interno
// altrimenti minima distanza con l'interno
else {
vtTang = itMinDistEnd->first - prev( itMinDistEnd)->first ;
}
@@ -1460,7 +1518,7 @@ GetPointParamOnPolyLine( const Point3d& ptP, const PolyLine& plPoly, double dTol
// assegno nuovo inizio
ptStart = ptEnd ;
}
// Il punto è sulla linea se la sua distanza rispetta la tolleranza
// Il punto è sulla linea se la sua distanza rispetta la tolleranza
return ( dMinSqDist < dToler * dToler) ;
}
@@ -1473,7 +1531,7 @@ ChangePolyLineStart( PolyLine& plPoly, const Point3d& ptNewStart, double dToler)
return false ;
// Riferimento alla lista dei punti
PNTULIST& LoopList = const_cast<PolyLine&>( plPoly).GetUPointList() ;
// Ciclo sui segmenti della polilinea per cercare il segmento più vicino al punto
// Ciclo sui segmenti della polilinea per cercare il segmento più vicino al punto
double dMinSqDist = SQ_INFINITO ;
auto itMinDistEnd = LoopList.end() ;
auto itStart = LoopList.begin() ;
@@ -1517,7 +1575,7 @@ SplitPolyLineAtPoint( const PolyLine& plPoly, const Point3d& ptP, double dToler,
return false ;
// Riferimento alla lista dei punti
const PNTULIST& LoopList = const_cast<PolyLine&>( plPoly).GetUPointList() ;
// Ciclo sui segmenti della polilinea per cercare il segmento più vicino al punto
// Ciclo sui segmenti della polilinea per cercare il segmento più vicino al punto
double dMinSqDist = SQ_INFINITO ;
auto itMinDistEnd = LoopList.end() ;
auto itStart = LoopList.begin() ;
@@ -1556,8 +1614,9 @@ AssociatePolyLinesMinDistPoints( const PolyLine& PL1, const PolyLine& PL2, PNTIV
int nPnt2 = PL2.GetPointNbr() ;
if ( nPnt1 == 0 || nPnt2 == 0)
return false ;
bCommonInternalPoints = false ; // indica la presenza di punti interni in comune tra le due polylines
// indica la presenza di punti interni in comune tra le due polylines
bCommonInternalPoints = false ;
vPnt1.reserve( PL1.GetPointNbr()) ;
Point3d ptP1 ;
@@ -1581,10 +1640,6 @@ AssociatePolyLinesMinDistPoints( const PolyLine& PL1, const PolyLine& PL2, PNTIV
int nLastJ = 0 ;
vPnt1[0].second = 0 ;
double dFirstDist, dFirstParMinDist ;
DistPointPolyLine( vPnt1[0].first, PL2, dFirstDist, dFirstParMinDist) ;
int nFirstMinJ = ( int)( dFirstParMinDist + 0.5) ;
for ( int i = 1 ; i < nTotP1 ; ++ i) {
double dDist = INFINITO ;
@@ -1593,7 +1648,7 @@ AssociatePolyLinesMinDistPoints( const PolyLine& PL1, const PolyLine& PL2, PNTIV
// distanza del punto dal segmento della polilinea
DistPointLine PointLineDistCalc( vPnt1[i].first, vPnt2[j-1].first, vPnt2[j].first) ;
double dPlDist ;
if ( PointLineDistCalc.GetDist( dPlDist) && dPlDist < dDist) {
if ( PointLineDistCalc.GetDist( dPlDist) && dPlDist < dDist - EPS_SMALL) {
dDist = dPlDist ;
PointLineDistCalc.GetParamAtMinDistPoint( dMinDistPar) ;
dMinDistPar += j - 1 ;
@@ -1601,15 +1656,11 @@ AssociatePolyLinesMinDistPoints( const PolyLine& PL1, const PolyLine& PL2, PNTIV
}
int nMinJ = ( int)( dMinDistPar + 0.5) ;
// eventuale correzione per i primi punti ( da forzare nel vertice 0)
if ( nLastJ == 0 && nFirstMinJ > 0.5 * nTotP2 && nMinJ >= nFirstMinJ)
nMinJ = 0 ;
if ( nMinJ < nLastJ)
nMinJ = nLastJ ;
// verifica se è un punto interno in comune con l'altra polyline
if ( i < nTotP1 - 1 && dDist < EPS_SMALL && abs( dMinDistPar - floor( dMinDistPar + 0.5)) < EPS_SMALL)
// verifica se è un punto interno in comune con l'altra polyline
if ( i < nTotP1 - 1 && dDist < EPS_SMALL && abs( dMinDistPar - floor( dMinDistPar + 0.5)) < EPS_SMALL)
bCommonInternalPoints = true ;
vPnt1[i].second = nMinJ ;
@@ -1619,9 +1670,6 @@ AssociatePolyLinesMinDistPoints( const PolyLine& PL1, const PolyLine& PL2, PNTIV
// calcoli per seconda curva
int nLastI = 0 ;
vPnt2[0].second = 0 ;
DistPointPolyLine( vPnt2[0].first, PL1, dFirstDist, dFirstParMinDist) ;
int nFirstMinI = ( int)( dFirstParMinDist + 0.5) ;
for ( int j = 1 ; j < nTotP2 ; ++ j) {
@@ -1631,8 +1679,7 @@ AssociatePolyLinesMinDistPoints( const PolyLine& PL1, const PolyLine& PL2, PNTIV
// distanza del punto dal segmento della polilinea
DistPointLine PointLineDistCalc( vPnt2[j].first, vPnt1[i-1].first, vPnt1[i].first) ;
double dPlDist ;
PointLineDistCalc.GetDist( dPlDist) ;
if ( dPlDist < dDist) {
if ( PointLineDistCalc.GetDist( dPlDist) && dPlDist < dDist - EPS_SMALL) {
dDist = dPlDist ;
PointLineDistCalc.GetParamAtMinDistPoint( dMinDistPar) ;
dMinDistPar += i - 1 ;
@@ -1640,19 +1687,331 @@ AssociatePolyLinesMinDistPoints( const PolyLine& PL1, const PolyLine& PL2, PNTIV
}
int nMinI = ( int)( dMinDistPar + 0.5) ;
// eventuale correzione per primi punti
if ( nLastI == 0 && nFirstMinI > 0.5 * nTotP1 && nMinI >= nFirstMinI)
nMinI = 0 ;
if ( nMinI < nLastI)
nMinI = nLastI ;
if ( j < nTotP2 - 1 && dDist < EPS_SMALL && abs( dMinDistPar - floor( dMinDistPar + 0.5)) < EPS_SMALL)
if ( j < nTotP2 - 1 && dDist < EPS_SMALL && abs( dMinDistPar - floor( dMinDistPar + 0.5)) < EPS_SMALL)
bCommonInternalPoints = true ;
vPnt2[j].second = nMinI ;
nLastI = nMinI ;
}
return true ;
}
//----------------------------------------------------------------------------
bool
MatchPolyLinesAddingPoints( const PolyLine& PL1, const PolyLine& PL2, int nType, PNTIVECTOR& vPnt1, PNTIVECTOR& vPnt2)
{
// prima trovo le associazioni senza aggiunte di punti
Point3d ptP2 ;
CurveComposite cc1, cc2 ;
cc1.FromPolyLine( PL1) ;
cc2.FromPolyLine( PL2) ;
int nPnt1 = PL1.GetPointNbr() ;
int nPnt2 = PL2.GetPointNbr() ;
vector<POINTU> vMatch2 ;
PL2.GetFirstPoint( ptP2) ;
while ( PL2.GetNextPoint( ptP2, true)) {
DistPointCurve dpc( ptP2, cc1, false) ;
int nFlag = 0 ;
double dParam ; dpc.GetParamAtMinDistPoint( 0, dParam, nFlag) ;
Point3d ptJoint ; dpc.GetMinDistPoint( 0, ptJoint, nFlag) ;
vMatch2.emplace_back( ptJoint, dParam) ;
}
int nAtStart2 = 0 ; // match ripetuti dalla curva U0 allo start della curva U1
int nAtEnd2 = 0 ;
Point3d ptP1 ; PL1.GetFirstPoint( ptP1) ;
int c = 0 ;
int nRep1 = 0 ; // match interni consecutivi uguali di punti della curva U0 con punti della curva U1
int nRep2 = 0 ;
double dLastParamMatch = 0 ;
Point3d ptLastPointMatch = ptP1 ;
BOOLVECTOR vbRep1( nPnt1) ;
INTVECTOR vnAddedOrNextIsRep1 ; // 0 non Rep, 1 Rep, 2 Next is Rep ;
DBLVECTOR vdSplit1 ;
DBLVECTOR vdMatch1 ;
fill( vbRep1.begin(), vbRep1.end(), false) ;
while ( PL1.GetNextPoint( ptP1, true)) {
// devo salvarmi se matcho più punti con lo start o l'end della curva totale
DistPointCurve dpc( ptP1, cc2, false) ;
int nFlag = 0 ;
double dParam ; dpc.GetParamAtMinDistPoint( 0, dParam, nFlag) ;
Point3d ptJoint ; dpc.GetMinDistPoint( 0, ptJoint, nFlag) ;
vdMatch1.push_back( dParam) ;
if ( dParam < EPS_SMALL ) {
++nAtStart2 ;
vbRep1[c] = true ;
++c ;
continue ;
}
else if ( dParam > nPnt2 - EPS_SMALL ) {
vbRep1[c] = nAtEnd2 == 0 ? false : true ;
vbRep1.back() = true ;
++ nAtEnd2 ;
++c ;
continue ;
}
if ( dParam <= dLastParamMatch || AreSamePointApprox( ptJoint, ptLastPointMatch)) {
dParam = dLastParamMatch ;
vbRep1[c] = true ;
++ nRep1 ;
++c ;
continue ;
}
else {
dLastParamMatch = dParam ;
ptLastPointMatch = ptJoint ;
// se sono già troppo vicino ad un split esistente allora non faccio nulla
if ( abs(dParam - round( dParam)) < 100 * EPS_PARAM) {
++c ;
continue ;
}
vdSplit1.push_back( dParam) ;
// verifico se ho un match per questo punto
// in tal caso vuol dire che sto creando una ripetizione nRep1
int nCase = 0 ;
for ( int j = 0 ; j < int( vMatch2.size()) ; ++j) {
if ( abs(vMatch2[j].second - (c + 1)) < EPS_SMALL) {
// devo però verificare che non ci sia un match successivo, perché in quel caso non ho una ripetizione
bool bFoundMatch = false ;
for ( int z = int( vMatch2[j].second) ; z < int( vdMatch1.size()) ; ++z) {
if ( abs( vdMatch1[z] - ( j + 1 )) < EPS_SMALL ) {
bFoundMatch = true ;
break ;
}
}
if ( ! bFoundMatch) {
++ nRep2 ;
// capisco se il punto è rep o se lo è il suo successivo
if ( j + 1 < dParam)
nCase = 1 ;
else
nCase = 2 ;
}
break ;
}
}
vnAddedOrNextIsRep1.push_back( nCase) ;
}
++c ;
}
int nAtStart1 = 0 ;
int nAtEnd1 = 0 ;
PL2.GetFirstPoint( ptP2) ;
c = 0 ;
dLastParamMatch = 0 ;
ptLastPointMatch = ptP2 ;
INTVECTOR vnAddedOrNextIsRep2 ; // 0 non Rep, 1 Rep, 2 Next is Rep ;
DBLVECTOR vdSplit2 ;
BOOLVECTOR vbRep2( nPnt2) ;
fill( vbRep2.begin(), vbRep2.end(), false) ;
while ( PL2.GetNextPoint( ptP2, true)) {
DistPointCurve dpc( ptP2, cc1, false) ;
int nFlag = 0 ;
double dParam ; dpc.GetParamAtMinDistPoint( 0, dParam, nFlag) ;
Point3d ptJoint ; dpc.GetMinDistPoint( 0, ptJoint, nFlag) ;
if ( dParam < EPS_SMALL ) {
++nAtStart1 ;
vbRep2[c] = true ;
++c ;
continue ;
}
else if ( dParam > nPnt1 - EPS_SMALL ) {
vbRep2[c] = ( nAtEnd1 == 0 ? false : true) ;
vbRep2.back() = true ;
++ nAtEnd1 ;
++c ;
continue ;
}
if ( dParam <= dLastParamMatch || AreSamePointApprox( ptJoint, ptLastPointMatch)) {
dParam = dLastParamMatch ;
vbRep2[c] = true ;
++ nRep2 ;
++c ;
continue ;
}
else {
dLastParamMatch = dParam ;
ptLastPointMatch = ptJoint ;
// se sono troppo vicino ad uno split esistente allora non faccio nulla
if ( abs( dParam - round( dParam)) < 100 * EPS_PARAM) {
++c ;
continue ;
}
vdSplit2.push_back( dParam) ;
// verifico se ho un match per questo punto
// in tal caso vuol dire che sto creando una ripetizione nRep0
int nCase = 0 ;
for ( int j = 0 ; j < int( vdMatch1.size()) ; ++j) {
if ( abs( vdMatch1[j] - (c + 1)) < EPS_SMALL) {
// devo però verificare che non ci sia un match successivo, perché in quel caso non ho una ripetizione
bool bFoundMatch = false ;
for ( int z = int( vdMatch1[j]) ; z < int( vMatch2.size()) ; ++z) {
if ( abs( vMatch2[z].second - ( j + 1 )) < EPS_SMALL) {
bFoundMatch = true ;
break ;
}
}
if ( ! bFoundMatch) {
++nRep1 ;
// capisco se il punto è rep o se lo è il suo successivo
if ( j + 1 < dParam)
nCase = 1 ;
else
nCase = 2 ;
}
break ;
}
}
vnAddedOrNextIsRep2.push_back( nCase) ;
}
++c ;
}
// applico effettivamente gli split e aggiungo gli elementi ai vettori vbRep
int nUnit = 0 ;
if ( ! vdSplit1.empty())
nUnit = int( vdSplit1.back()) ;
for ( int z = int( vdSplit1.size()) - 1 ; z >= 0 ; --z) {
double dSplit = vdSplit1[z] ;
int nSplit = int( dSplit) ;
// se sto cercando di fare uno split sulla stessa curva che ho già splittato al passaggio precedente allora devo
// riscalare
if ( nSplit == nUnit && z < int( vdSplit1.size()) - 1) {
dSplit = nSplit + ( dSplit - nSplit) / ( vdSplit1[z+1] - nSplit) ;
}
nUnit = nSplit ;
cc2.AddJoint( dSplit) ;
switch ( vnAddedOrNextIsRep1[z]) {
case 0 :
if ( vbRep2[nSplit])
++ nRep2 ;
// di default aggiungerei false, ma se il successivo è già un Rep allora anche questo deve esserlo
vbRep2.insert( vbRep2.begin() + nSplit, vbRep2[nSplit]) ;
break ;
case 1 :
vbRep2.insert( vbRep2.begin() + nSplit, true) ;
break ;
case 2 :
if ( vbRep2[nSplit])
--nRep2 ;
else
vbRep2[nSplit] = true ;
vbRep2.insert( vbRep2.begin() + nSplit, false) ;
break ;
}
}
if ( ! vdSplit2.empty())
nUnit = int( vdSplit2.back()) ;
for ( int z = int( vdSplit2.size()) - 1 ; z >= 0 ; --z) {
double dSplit = vdSplit2[z] ;
int nSplit = int( dSplit) ;
// se sto cercando di fare uno split sulla stessa curva che ho già splittato al passaggio precedente allora devo
// riscalare
if ( nSplit == nUnit && z < int( vdSplit2.size()) - 1) {
dSplit = nSplit + ( dSplit - nSplit) / (vdSplit2[z+1] - nSplit) ;
}
nUnit = nSplit ;
cc1.AddJoint( dSplit) ;
switch ( vnAddedOrNextIsRep2[z]) {
case 0 :
if ( vbRep1[nSplit])
++ nRep1 ;
// di default aggiungerei false, ma se il successivo è già un Rep allora anche questo deve esserlo
vbRep1.insert( vbRep1.begin() + nSplit, vbRep1[nSplit]) ;
break ;
case 1 :
vbRep1.insert( vbRep1.begin() + nSplit, true) ;
break ;
case 2 :
if ( vbRep1[nSplit])
-- nRep1 ;
else
vbRep1[nSplit] = true ;
vbRep1.insert( vbRep1.begin() + nSplit, false) ;
break ;
}
}
nPnt1 = cc1.GetCurveCount() ;
nPnt2 = cc2.GetCurveCount() ;
//aggiusto i vettori delle ripetizioni in modo in modo che non arrivino mai ad essere contemporaneamente true
int nAddedSpan = 0 ;
int nCrv1 = 0 ;
int nCrv2 = 0 ;
while ( nAddedSpan < nPnt1 + nAtStart1 + nAtEnd1 + nRep2) {
if ( nCrv1 >= nPnt1)
nCrv1 = nPnt1 - 1 ;
if ( nCrv2 >= nPnt2)
nCrv2 = nPnt2 - 1 ;
bool bRep1 = vbRep1[nCrv1] ;
bool bRep2 = vbRep2[nCrv2] ;
if ( bRep1 && bRep2) {
vbRep1[nCrv1] = false ;
bRep1 = false ;
vbRep2[nCrv2] = false ;
bRep2 = false ;
-- nRep1 ;
-- nRep2 ;
}
if ( ! bRep1 || nCrv2 == nPnt2 - 1)
++ nCrv2 ;
if ( ! bRep2 || nCrv1 == nPnt1 - 1)
++ nCrv1 ;
++ nAddedSpan ;
}
// se non sono arrivato all'ultima curva su U0 o U1 vuol dire che ho creato delle ripetizioni che non ho contato prima
if ( nCrv2 < nPnt2) {
nRep2 += nPnt2 - nCrv2 ;
for ( int z = int( vbRep2.size()) - 1 ; z >= nCrv2 ; --z)
vbRep2[z] = true ;
}
if( nCrv1 < nPnt1) {
nRep1 += nPnt1 - nCrv1 ;
for ( int z = int( vbRep1.size()) - 1 ; z >= nCrv1 ; --z)
vbRep1[z] = true ;
}
// trovo il numero di span che dovrà avere la superficie
// ( numero di sottocurve che compongono la U0 + tutte le ripetizioni dei match di punti della curva U1 con i punti di U0)
int nPnt = nPnt1 + nAtStart1 + nAtEnd1 + nRep2 ;
if ( nPnt != nPnt2 + nAtStart2 + nAtEnd2 + nRep1)
LOG_DBG_ERR( GetEGkLogger(), "There could be an error in the creation of a ruled surface in mode RLT_B_MINDIST_PLUS") ;
// aggiungo i punti di controllo scorrendo in contemporanea le due curve
nAddedSpan = 0 ;
nCrv1 = 0 ;
nCrv2 = 0 ;
bool bLast1 = false ;
bool bLast2 = false ;
while ( nAddedSpan < nPnt) {
if ( nCrv1 >= nPnt1) {
nCrv1 = nPnt1 - 1 ;
bLast1 = true ;
}
if ( nCrv2 >= nPnt2) {
nCrv2 = nPnt2 - 1 ;
bLast2 = true ;
}
bool bRep1 = vbRep1[nCrv1] ;
bool bRep2 = vbRep2[nCrv2] ;
const ICurve* pSubCrv1 = cc1.GetCurve( nCrv1) ;
Point3d ptStart1 ; pSubCrv1->GetStartPoint( ptStart1) ;
vPnt1.emplace_back( ptStart1, nAddedSpan) ;
const ICurve* pSubCrv2 = cc2.GetCurve( nCrv2) ;
Point3d ptStart2 ; pSubCrv2->GetStartPoint( ptStart2) ;
vPnt2.emplace_back( ptStart2, nAddedSpan) ;
if ( ! bRep2)
++ nCrv1 ;
if ( ! bRep1)
++ nCrv2 ;
++ nAddedSpan ;
}
return true ;
}
}
+7 -2
View File
@@ -150,12 +150,18 @@ PolygonElevationInClosedSurfTm( const Polygon3d& pgFacet, const ISurfTriMesh& Cl
Vector3d vtN = pgFacet.GetVersN() ;
PolyLine PL = pgFacet.GetPolyLine() ;
// calcolo elevazione massima del contorno della faccia
// calcolo elevazione massima del contorno della faccia e nel suo centro
const double RAY_LEN = 100000 ;
dElev = 0 ;
PNTVECTOR vptP ; vptP.reserve( PL.GetPointNbr()) ;
Point3d ptP ;
bool bFound = PL.GetFirstPoint( ptP) ;
while ( bFound) {
vptP.push_back( ptP) ;
bFound = PL.GetNextPoint( ptP, true) ;
}
vptP.push_back( ptCen) ;
for ( const Point3d& ptP : vptP) {
ILSIVECTOR vInters ;
IntersLineSurfTm( ptP, vtN, RAY_LEN, CldStm, vInters, true) ;
for ( int i = 0 ; i < int( vInters.size()) ; ++ i) {
@@ -171,7 +177,6 @@ PolygonElevationInClosedSurfTm( const Polygon3d& pgFacet, const ISurfTriMesh& Cl
else if ( Inters.nILTT == ILTT_SEGM || Inters.nILTT == ILTT_SEGM_ON_EDGE)
dElev = max( dElev, Inters.dU2) ;
}
bFound = PL.GetNextPoint( ptP, true) ;
}
// calcolo elevazione massima degli eventuali spigoli (e vertici) della superficie chiusa dalla parte positiva della faccia e che cadono in essa
int nEdgeCnt = CldStm.GetEdgeCount() ;
+5 -5
View File
@@ -19,10 +19,10 @@
void
PolygonPlane::AddPoint( const Point3d& ptP)
{
// se è il primo punto (parto da -1 perchè verrà contato alla chiusura)
// se è il primo punto (parto da -1 perchè verrà contato alla chiusura)
if ( m_nPntNbr == -1) {
// inizializzazioni
m_dLenN = 0 ;
m_dLenN = -1 ;
m_vtN = V_NULL ;
m_ptMid = ORIG ;
m_dSXy = 0 ; m_dSXz = 0 ;
@@ -60,16 +60,16 @@ PolygonPlane::AddPoint( const Point3d& ptP)
bool
PolygonPlane::Finalize( void)
{
// almeno 3 punti (il triangolo è il poligono con minimo numero di lati)
// almeno 3 punti (il triangolo è il poligono con minimo numero di lati)
if ( m_nPntNbr + 1 < 3)
return false ;
// se il poligono non è stato chiuso, aggiungo calcolo per ultimo lato
// se il poligono non è stato chiuso, aggiungo calcolo per ultimo lato
if ( ! AreSamePointExact( m_ptFirst, m_ptLast)) {
// aggiungo il primo punto per far eseguire i conti sul lato di chiusura
AddPoint( m_ptFirst) ;
}
// se non effettuato, eseguo il calcolo finale
if ( m_dLenN < EPS_SMALL) {
if ( m_dLenN < 0) {
// lunghezza della normale (doppio dell'area del poligono)
m_dLenN = m_vtN.Len() ;
if ( m_dLenN < SQ_EPS_SMALL)
+915
View File
@@ -0,0 +1,915 @@
//----------------------------------------------------------------------------
// EgalTech 2023-2025
//----------------------------------------------------------------------------
// File : ProjectCurveSurfTm.cpp Data : 29.08.25 Versione : 2.7h2
// Contenuto : Implementazione funzioni proiezione curve su superficie Trimesh.
//
//
//
// Modifiche : 31.08.23 DS Creazione modulo.
//
//
//----------------------------------------------------------------------------
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "SurfTriMesh.h"
#include "SurfBezier.h"
#include "GeoConst.h"
#include "/EgtDev/Include/EGkDistPointLine.h"
#include "/EgtDev/Include/EGkDistPointCurve.h"
#include "/EgtDev/Include/EGkDistPointSurfTm.h"
#include "/EgtDev/Include/EGkIntersPlanePlane.h"
#include "/EgtDev/Include/EGkIntersLinePlane.h"
#include "/EgtDev/Include/EGkIntersLineSurfTm.h"
#include "/EgtDev/Include/EGkProjectCurveSurf.h"
using namespace std ;
//----------------------------------------------------------------------------
// Angolo limite tra normale al triangolo e direzione di proiezione 89°
const double COS_ANG_LIM = 0.0175 ;
// Angolo massimo tra normali per effettuare bisezione su spigolo
const double COS_ANG_MAX_CORNER = 0.8660 ;
// Tipologia di punto
const int P5AX_TO_DELETE = -1 ; // da cancellare
const int P5AX_OUT = 0 ; // aggiunto prima di inizio o dopo fine
const int P5AX_STD = 1 ; // standard
const int P5AX_CVEX = 2 ; // su angolo convesso
const int P5AX_CONC = 3 ; // in angolo concavo
const int P5AX_BEFORE_CONC = 4 ; // adiacente ad angolo concavo
const int P5AX_AFTER_CONC = 5 ; // adiacente ad angolo concavo
//----------------------------------------------------------------------------
static double
GetSurfBezierTol( double dLinTol)
{
return max( dLinTol / 10, EPS_SMALL) ;
}
//----------------------------------------------------------------------------
static bool
PointsInTolerance( const PNT5AXVECTOR& vPt5ax, int nPrec, int nCurr, int nNext, double dSqTol)
{
for ( int i = nPrec + 1 ; i < nCurr ; ++ i) {
double dSqDist ;
if ( ! DistPointLine( vPt5ax[i].ptP, vPt5ax[nPrec].ptP, vPt5ax[nNext].ptP).GetSqDist( dSqDist) || dSqDist > dSqTol)
return false ;
}
return true ;
}
//----------------------------------------------------------------------------
static bool
RemovePointsInExcess( PNT5AXVECTOR& vPt5ax, double dLinTol, double dMaxSegmLen, bool bTestDir)
{
// Parametri di riferimento
double dSqMaxLen = dMaxSegmLen * dMaxSegmLen ;
double dSqTol = dLinTol * dLinTol ;
const double LENREF = 200 ;
double dCosAngLim = 1 - dSqTol / ( 2 * LENREF * LENREF) ;
// Cerco gli angoli interni e marco opportunamente i punti nelle vicinanze fino ai limiti prima e dopo
int nInd = 0 ;
while ( nInd < int( vPt5ax.size())) {
if ( vPt5ax[nInd].nFlag == P5AX_CONC) {
// analizzo i punti appena precedenti
int nIpv = nInd - 1 ;
while ( nIpv >= 0) {
double dSqLen = SqDist( vPt5ax[nInd].ptP, vPt5ax[nIpv].ptP) ;
if ( dSqLen < dSqMaxLen)
vPt5ax[nIpv].nFlag = P5AX_TO_DELETE ;
else {
vPt5ax[nIpv].nFlag = P5AX_BEFORE_CONC ;
break ;
}
-- nIpv ;
}
// analizzo i punti appena successivi
int nInx = nInd + 1 ;
while ( nInx < int( vPt5ax.size())) {
double dSqLen = SqDist( vPt5ax[nInd].ptP, vPt5ax[nInx].ptP) ;
if ( dSqLen < dSqMaxLen)
vPt5ax[nInx].nFlag = P5AX_TO_DELETE ;
else {
vPt5ax[nInx].nFlag = P5AX_AFTER_CONC ;
break ;
}
++ nInx ;
}
}
++ nInd ;
}
// Rimuovo i punti allineati entro la tolleranza e non più lontani tra loro del massimo
int nCnt = 0 ;
int nPrec = 0 ;
int nCurr = 1 ;
int nNext = 2 ;
while ( nNext < int( vPt5ax.size())) {
bool bRemove = false ;
// lunghezza del segmento che unisce gli adiacenti
double dSqLen = SqDist( vPt5ax[nPrec].ptP, vPt5ax[nNext].ptP) ;
// se rimovibile (Flag standard) e lunghezza inferiore al massimo, passo agli altri controlli
if ( vPt5ax[nCurr].nFlag == P5AX_STD && dSqLen <= dSqMaxLen) {
// distanza del punto corrente dal segmento che unisce gli adiacenti
DistPointLine dPL( vPt5ax[nCurr].ptP, vPt5ax[nPrec].ptP, vPt5ax[nNext].ptP) ;
double dSqDist ;
// se distanza inferiore a tolleranza lineare
if ( dPL.GetSqDist( dSqDist) && dSqDist < dSqTol && PointsInTolerance( vPt5ax, nPrec, nCurr, nNext, dSqTol)) {
// verifico se errore angolare inferiore a limite
double dPar ; dPL.GetParamAtMinDistPoint( dPar) ;
if ( bTestDir) {
Vector3d vtNew = Media( vPt5ax[nPrec].vtDir1, vPt5ax[nNext].vtDir1, dPar) ;
if ( vtNew.Normalize() && vtNew * vPt5ax[nCurr].vtDir1 > dCosAngLim)
bRemove = true ;
}
else {
Vector3d vtNew = Media( vPt5ax[nPrec].vtDir2, vPt5ax[nNext].vtDir2, dPar) ;
if ( vtNew.Normalize() && vtNew * vPt5ax[nCurr].vtDir2 > dCosAngLim)
bRemove = true ;
}
}
}
// se da eliminare
if ( bRemove) {
// dichiaro da eliminare il punto
vPt5ax[nCurr].nFlag = P5AX_TO_DELETE ;
// avanzo con corrente e successivo
nCurr = nNext ;
++ nNext ;
}
// altrimenti da tenere
else {
// avanzo il terzetto di uno step
nPrec = nCurr ;
nCurr = nNext ;
++ nNext ;
// incremento contatore dei punti conservati
++ nCnt ;
}
}
// Copio i punti da conservare in un vettore temporaneo
PNT5AXVECTOR vMyPt5ax ;
vMyPt5ax.reserve( nCnt) ;
for ( const auto& Pt5ax : vPt5ax) {
if ( Pt5ax.nFlag != P5AX_TO_DELETE)
vMyPt5ax.emplace_back( Pt5ax) ;
}
// scambio i due vettori
vPt5ax.swap( vMyPt5ax) ;
return true ;
}
// --- vettore di oggetti intersezione massiva rette parallele SurfTM --------
typedef std::vector<IntersParLinesSurfTm*> INTPARLINESTMPVECTOR ;
//----------------------------------------------------------------------------
static bool
ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const Frame3d& frRefLine, const INTPARLINESTMPVECTOR& vpIntPLSTM,
double dPar, Point5ax& Pt5ax)
{
// intersezione retta di proiezione con superfici (conservo l'intersezione più alta)
Point3d ptL = GetToLoc( ptP, frRefLine) ;
int nInd = -1 ;
IntLinStmInfo IntRes ;
for ( int i = 0 ; i < int( vpIntPLSTM.size()) ; ++ i) {
ILSIVECTOR vIntRes ;
if ( vpIntPLSTM[i]->GetInters( ptL, 1, vIntRes, false)) {
// cerco la prima intersezione valida a partire dall'ultima (è la più alta)
int nI = int( vIntRes.size()) - 1 ;
while ( nI >= 0 && abs( vIntRes[nI].dCosDN) < COS_ANG_LIM)
--nI ;
// se trovata
if ( nI >= 0) {
if ( nInd < 0) {
IntRes = vIntRes[nI] ;
nInd = i ;
}
else {
double dUref = (( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE) ? IntRes.dU2 : IntRes.dU) ;
double dU = (( vIntRes[nI].nILTT == ILTT_SEGM || vIntRes[nI].nILTT == ILTT_SEGM_ON_EDGE) ? vIntRes[nI].dU2 : vIntRes[nI].dU) ;
if ( dU > dUref) {
IntRes = vIntRes[nI] ;
nInd = i ;
}
}
}
}
}
// se trovata
if ( nInd >= 0) {
// calcolo il punto
Point3d ptInt ;
if ( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE)
ptInt = IntRes.ptI2 ;
else
ptInt = IntRes.ptI ;
// calcolo la normale (si calcola smooth, in caso di errore si prende quella del triangolo)
Triangle3dEx trTria ;
if ( ! vpStm[nInd]->GetTriangle( IntRes.nT, trTria))
return false ;
Vector3d vtN ;
if ( ! CalcNormal( ptInt, trTria, vtN))
vtN = trTria.GetN() ;
// assegno valori al punto 5assi
Pt5ax.ptP = ptInt ;
Pt5ax.vtDir1 = vtN ;
Pt5ax.vtDir2 = frRefLine.VersZ() ;
Pt5ax.dPar = dPar ;
Pt5ax.nFlag = P5AX_STD ;
// ritorno con successo
return true ;
}
return false ;
}
//----------------------------------------------------------------------------
bool
ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const Vector3d& vtDir,
double dLinTol, double dMaxSegmLen, bool bSharpEdges, PNT5AXVECTOR& vPt5ax)
{
// sistemazioni per tipo di superficie
CISRFTMPVECTOR vpSurfTm ;
for ( int i = 0 ; i < int( vpSurf.size()) ; ++ i) {
const SurfTriMesh* pSurfTm = nullptr ;
switch ( vpSurf[i]->GetType()) {
case SRF_TRIMESH :
pSurfTm = GetBasicSurfTriMesh( vpSurf[i]) ;
break ;
case SRF_BEZIER :
{ double dOldLinTol = GetSurfBezierAuxSurfRefinedTol() ;
SetSurfBezierAuxSurfRefinedTol( GetSurfBezierTol( dLinTol)) ;
pSurfTm = GetBasicSurfBezier( vpSurf[i])->GetAuxSurfRefined() ;
SetSurfBezierAuxSurfRefinedTol( dOldLinTol) ;
} break ;
case SRF_FLATRGN :
pSurfTm = GetBasicSurfFlatRegion( vpSurf[i])->GetAuxSurf() ;
break ;
default :
break ;
}
if ( pSurfTm == nullptr)
return false ;
vpSurfTm.emplace_back( pSurfTm) ;
}
// controllo le tolleranze
dLinTol = max( dLinTol, LIN_TOL_MIN) ;
dMaxSegmLen = max( dMaxSegmLen, 10 * EPS_SMALL) ;
// approssimo la curva con una polilinea alla massima risoluzione
PolyLine PL ;
if ( ! crCrv.ApproxWithLines( EPS_SMALL, ANG_TOL_STD_DEG, ICurve::APL_STD, PL))
return false ;
const double MAX_SEG_LEN = min( dMaxSegmLen, 0.977) ;
if ( ! PL.AdjustForMaxSegmentLen( MAX_SEG_LEN))
return false ;
// Oggetti per calcolo massivo intersezioni tra linee di proiezione e superfici
Frame3d frRefLine ;
if ( ! frRefLine.Set( ORIG, vtDir))
return false ;
INTPARLINESTMPVECTOR vpIntPLSTM ; vpIntPLSTM.reserve( vpSurfTm.size()) ;
for ( int i = 0 ; i < int( vpSurfTm.size()) ; ++ i) {
IntersParLinesSurfTm* pIntPLSTM = new IntersParLinesSurfTm( frRefLine, *vpSurfTm[i]) ;
if ( pIntPLSTM == nullptr) {
for ( int j = 0 ; j < int( vpIntPLSTM.size()) ; ++ j)
delete vpIntPLSTM[j] ;
return false ;
}
vpIntPLSTM.emplace_back( pIntPLSTM) ;
}
// Pulisco e riservo spazio nel vettore dei punti risultanti
vPt5ax.clear() ;
vPt5ax.reserve( PL.GetPointNbr()) ;
// proietto i punti della polilinea sulla superficie
double dPar ;
Point3d ptP ;
bool bFound = PL.GetFirstUPoint( &dPar, &ptP) ;
while ( bFound) {
// se trovo proiezione, la salvo
Point5ax Pt5ax ;
if ( ProjectPointOnSurf( ptP, vpSurfTm, frRefLine, vpIntPLSTM, dPar, Pt5ax))
vPt5ax.emplace_back( Pt5ax) ;
// passo al successivo
bFound = PL.GetNextUPoint( &dPar, &ptP) ;
}
// Libero oggetti per calcolo massivo
for ( int i = 0 ; i < int( vpIntPLSTM.size()) ; ++ i)
delete vpIntPLSTM[i] ;
// se richiesto, inserimento punti intermedi in presenza di spigoli
if ( bSharpEdges) {
for ( int i = 1 ; i < int( vPt5ax.size()) ; ++ i) {
// precedente
int j = i - 1 ;
// se normali tra corrente e precedente oltre limite e punti abbastanza lontani
if ( vPt5ax[i].vtDir1 * vPt5ax[j].vtDir1 < COS_ANG_MAX_CORNER &&
SqDist( vPt5ax[i].ptP, vPt5ax[j].ptP) > 25 * SQ_EPS_SMALL) {
// intersezione tra le due facce
Plane3d plPlane1 ; plPlane1.Set( vPt5ax[j].ptP, vPt5ax[j].vtDir1) ;
Plane3d plPlane2 ; plPlane2.Set( vPt5ax[i].ptP, vPt5ax[i].vtDir1) ;
Point3d ptEdge ; Vector3d vtEdge ;
if ( IntersPlanePlane( plPlane1, plPlane2, ptEdge, vtEdge) == IPPT_YES) {
Plane3d plPlane3 ; plPlane3.Set( vPt5ax[i].ptP, ( vPt5ax[i].ptP - vPt5ax[j].ptP) ^ vtDir) ;
Point3d ptInt ;
if ( IntersLinePlane( ptEdge, vtEdge, 1, plPlane3, ptInt, false) == ILPT_YES) {
// verifico se spigolo convesso o concavo
bool bConvex ;
if ( ! AreSamePointApprox( ptInt, vPt5ax[j].ptP))
bConvex = ( ( vPt5ax[j].vtDir1 ^ ( ptInt - vPt5ax[j].ptP)) * vtEdge > 0) ;
else
bConvex = (( vPt5ax[i].vtDir1 ^ ( ptInt - vPt5ax[i].ptP)) * vtEdge < 0) ;
// se convesso, metto due punti con direzione appena prima e appena dopo
if ( bConvex) {
Vector3d vtLine1 = ptInt - vPt5ax[j].ptP ; double dLen1 = vtLine1.Len() ;
Vector3d vtLine2 = vPt5ax[i].ptP - ptInt ; double dLen2 = vtLine2.Len() ;
if ( dLen1 > 2 * EPS_SMALL) {
Point5ax Pt5ax ;
Pt5ax.ptP = ptInt - vtLine1 / dLen1 * 2 * EPS_SMALL ;
Pt5ax.vtDir1 = vPt5ax[j].vtDir1 ;
Pt5ax.vtDir2 = vtDir ;
Pt5ax.dPar = ( vPt5ax[i].dPar + vPt5ax[j].dPar) / 2 ;
Pt5ax.nFlag = P5AX_CVEX ;
vPt5ax.insert( vPt5ax.begin() + i, Pt5ax) ;
++ i ;
}
if ( dLen2 > 2 * EPS_SMALL) {
Point5ax Pt5ax ;
Pt5ax.ptP = ptInt + vtLine2 / dLen2 * 2 * EPS_SMALL ;
Pt5ax.vtDir1 = vPt5ax[i].vtDir1 ;
Pt5ax.vtDir2 = vtDir ;
Pt5ax.dPar = ( vPt5ax[i].dPar + vPt5ax[j].dPar) / 2 ;
Pt5ax.nFlag = P5AX_CVEX ;
vPt5ax.insert( vPt5ax.begin() + i, Pt5ax) ;
++ i ;
}
}
// altrimenti concavo, aggiungo un solo punto con la direzione media
else {
Point5ax Pt5ax ;
Pt5ax.ptP = ptInt ;
Pt5ax.vtDir1 = Media( vPt5ax[i].vtDir1, vPt5ax[j].vtDir1) ;
Pt5ax.vtDir2 = vtDir ;
Pt5ax.dPar = ( vPt5ax[i].dPar + vPt5ax[j].dPar) / 2 ;
Pt5ax.nFlag = P5AX_CONC ;
vPt5ax.insert( vPt5ax.begin() + i, Pt5ax) ;
++ i ;
}
}
}
}
}
}
// rimozione punti in eccesso rispetto alle tolleranze
RemovePointsInExcess( vPt5ax, dLinTol, dMaxSegmLen, bSharpEdges) ;
return true ;
}
//----------------------------------------------------------------------------
static bool
ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const IGeoPoint3d& gpRef, double dPar, Point5ax& Pt5ax)
{
// punto di riferimento
Point3d ptMin = gpRef.GetPoint() ;
// intersezione della retta di minima distanza con le superfici
Vector3d vtLine = ptP - ptMin ;
double dLineLen = vtLine.Len() ;
if ( dLineLen > EPS_SMALL) {
vtLine /= dLineLen ;
// conservo l'intersezione più alta
int nInd = -1 ;
IntLinStmInfo IntRes ;
for ( int i = 0 ; i < int( vpStm.size()) ; ++ i) {
ILSIVECTOR vIntRes ;
if ( IntersLineSurfTm( ptP, vtLine, dLineLen, *vpStm[i], vIntRes, false)) {
// cerco la prima intersezione valida a partire dall'ultima (è la più alta)
int nI = int( vIntRes.size()) - 1 ;
while ( nI >= 0 && abs( vIntRes[nI].dCosDN) < COS_ANG_LIM)
--nI ;
// se trovata
if ( nI >= 0) {
if ( nInd < 0) {
IntRes = vIntRes[nI] ;
nInd = i ;
}
else {
double dUref = (( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE) ? IntRes.dU2 : IntRes.dU) ;
double dU = (( vIntRes[nI].nILTT == ILTT_SEGM || vIntRes[nI].nILTT == ILTT_SEGM_ON_EDGE) ? vIntRes[nI].dU2 : vIntRes[nI].dU) ;
if ( dU > dUref) {
IntRes = vIntRes[nI] ;
nInd = i ;
}
}
}
}
}
// se trovata
if ( nInd >= 0) {
// calcolo il punto
Point3d ptInt ;
if ( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE)
ptInt = IntRes.ptI2 ;
else
ptInt = IntRes.ptI ;
// calcolo la normale (si calcola smooth, in caso di errore si prende quella del triangolo)
Triangle3dEx trTria ;
if ( ! vpStm[nInd]->GetTriangle( IntRes.nT, trTria))
return false ;
Vector3d vtN ;
if ( ! CalcNormal( ptInt, trTria, vtN))
vtN = trTria.GetN() ;
// assegno valori al punto 5assi
Pt5ax.ptP = ptInt ;
Pt5ax.vtDir1 = vtN ;
Pt5ax.vtDir2 = vtLine ;
Pt5ax.dPar = dPar ;
Pt5ax.nFlag = P5AX_STD ;
// ritorno con successo
return true ;
}
}
return false ;
}
//----------------------------------------------------------------------------
bool
ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const IGeoPoint3d& gpRef,
double dLinTol, double dMaxSegmLen, bool bSharpEdges, PNT5AXVECTOR& vPt5ax)
{
// sistemazioni per tipo di superficie
CISRFTMPVECTOR vpSurfTm ;
for ( int i = 0 ; i < int( vpSurf.size()) ; ++ i) {
const SurfTriMesh* pSurfTm = nullptr ;
switch ( vpSurf[i]->GetType()) {
case SRF_TRIMESH :
pSurfTm = GetBasicSurfTriMesh( vpSurf[i]) ;
break ;
case SRF_BEZIER :
{ double dOldLinTol = GetSurfBezierAuxSurfRefinedTol() ;
SetSurfBezierAuxSurfRefinedTol( GetSurfBezierTol( dLinTol)) ;
pSurfTm = GetBasicSurfBezier( vpSurf[i])->GetAuxSurfRefined() ;
SetSurfBezierAuxSurfRefinedTol( dOldLinTol) ;
} break ;
case SRF_FLATRGN :
pSurfTm = GetBasicSurfFlatRegion( vpSurf[i])->GetAuxSurf() ;
break ;
default :
break ;
}
if ( pSurfTm == nullptr)
return false ;
vpSurfTm.emplace_back( pSurfTm) ;
}
// controllo le tolleranze
dLinTol = max( dLinTol, LIN_TOL_MIN) ;
dMaxSegmLen = max( dMaxSegmLen, 10 * EPS_SMALL) ;
// approssimo la curva con una polilinea entro la metà della tolleranza
PolyLine PL ;
if ( ! crCrv.ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_STD, PL))
return false ;
const double MAX_SEG_LEN = min( dMaxSegmLen, 0.977) ;
if ( ! PL.AdjustForMaxSegmentLen( MAX_SEG_LEN))
return false ;
// Pulisco e riservo spazio nel vettore dei punti risultanti
vPt5ax.clear() ;
vPt5ax.reserve( PL.GetPointNbr()) ;
// proietto i punti della polilinea sulla superficie con direzione data dal punto di riferimento
double dPar ;
Point3d ptP ;
bool bFound = PL.GetFirstUPoint( &dPar, &ptP) ;
while ( bFound) {
// se trovo proiezione, la salvo
Point5ax Pt5ax ;
if ( ProjectPointOnSurf( ptP, vpSurfTm, gpRef, dPar, Pt5ax))
vPt5ax.emplace_back( Pt5ax) ;
// passo al successivo
bFound = PL.GetNextUPoint( &dPar, &ptP) ;
}
// se richiesto, inserimento punti intermedi in presenza di spigoli
if ( bSharpEdges) {
for ( int i = 1 ; i < int( vPt5ax.size()) ; ++ i) {
// precedente
int j = i - 1 ;
// se normali tra corrente e precedente oltre limite e punti abbastanza lontani
if ( vPt5ax[i].vtDir1 * vPt5ax[j].vtDir1 < COS_ANG_MAX_CORNER &&
SqDist( vPt5ax[i].ptP, vPt5ax[j].ptP) > 25 * SQ_EPS_SMALL) {
// punto medio
Point3d ptMid = Media( vPt5ax[i].ptP, vPt5ax[j].ptP) ;
double dMid = ( vPt5ax[i].dPar + vPt5ax[j].dPar) / 2 ;
// se trovo proiezione, la salvo
Point5ax Pt5ax ;
if ( ProjectPointOnSurf( ptMid, vpSurfTm, gpRef, dMid, Pt5ax)) {
vPt5ax.insert( vPt5ax.begin() + i, Pt5ax) ;
-- i ;
}
}
}
}
// rimozione punti in eccesso rispetto alle tolleranze
RemovePointsInExcess( vPt5ax, dLinTol, dMaxSegmLen, bSharpEdges) ;
return true ;
}
//----------------------------------------------------------------------------
static bool
ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const ICurve& crRef, double dPar, Point5ax& Pt5ax)
{
// punto a minima distanza
DistPointCurve dPC( ptP, crRef) ;
Point3d ptMin ;
int nFlag ;
if ( dPC.GetMinDistPoint( 0, ptMin, nFlag)) {
// intersezione della retta di minima distanza con le superfici
Vector3d vtLine = ptP - ptMin ;
double dLineLen = vtLine.Len() ;
if ( dLineLen > EPS_SMALL) {
vtLine /= dLineLen ;
// conservo l'intersezione più alta
int nInd = -1 ;
IntLinStmInfo IntRes ;
for ( int i = 0 ; i < int( vpStm.size()) ; ++ i) {
ILSIVECTOR vIntRes ;
if ( IntersLineSurfTm( ptP, vtLine, dLineLen, *vpStm[i], vIntRes, false)) {
// cerco la prima intersezione valida a partire dall'ultima (è la più alta)
int nI = int( vIntRes.size()) - 1 ;
while ( nI >= 0 && abs( vIntRes[nI].dCosDN) < COS_ANG_LIM)
--nI ;
// se trovata
if ( nI >= 0) {
if ( nInd < 0) {
IntRes = vIntRes[nI] ;
nInd = i ;
}
else {
double dUref = (( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE) ? IntRes.dU2 : IntRes.dU) ;
double dU = (( vIntRes[nI].nILTT == ILTT_SEGM || vIntRes[nI].nILTT == ILTT_SEGM_ON_EDGE) ? vIntRes[nI].dU2 : vIntRes[nI].dU) ;
if ( dU > dUref) {
IntRes = vIntRes[nI] ;
nInd = i ;
}
}
}
}
}
// se trovata
if ( nInd >= 0) {
// assegno il punto
Point3d ptInt ;
if ( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE)
ptInt = IntRes.ptI2 ;
else
ptInt = IntRes.ptI ;
// calcolo la normale (si calcola smooth, in caso di errore si prende quella del triangolo)
Triangle3dEx trTria ;
if ( ! vpStm[nInd]->GetTriangle( IntRes.nT, trTria))
return false ;
Vector3d vtN ;
if ( ! CalcNormal( ptInt, trTria, vtN))
vtN = trTria.GetN() ;
// assegno valori al punto 5assi
Pt5ax.ptP = ptInt ;
Pt5ax.vtDir1 = vtN ;
Pt5ax.vtDir2 = vtLine ;
Pt5ax.dPar = dPar ;
Pt5ax.nFlag = P5AX_STD ;
// ritorno con successo
return true ;
}
}
}
return false ;
}
//----------------------------------------------------------------------------
bool
ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const ICurve& crRef,
double dLinTol, double dMaxSegmLen, bool bSharpEdges, PNT5AXVECTOR& vPt5ax)
{
// Sistemazioni per tipo di superficie
CISRFTMPVECTOR vpSurfTm ;
for ( int i = 0 ; i < int( vpSurf.size()) ; ++ i) {
const SurfTriMesh* pSurfTm = nullptr ;
switch ( vpSurf[i]->GetType()) {
case SRF_TRIMESH :
pSurfTm = GetBasicSurfTriMesh( vpSurf[i]) ;
break ;
case SRF_BEZIER :
{ double dOldLinTol = GetSurfBezierAuxSurfRefinedTol() ;
SetSurfBezierAuxSurfRefinedTol( GetSurfBezierTol( dLinTol)) ;
pSurfTm = GetBasicSurfBezier( vpSurf[i])->GetAuxSurfRefined() ;
SetSurfBezierAuxSurfRefinedTol( dOldLinTol) ;
} break ;
case SRF_FLATRGN :
pSurfTm = GetBasicSurfFlatRegion( vpSurf[i])->GetAuxSurf() ;
break ;
default :
break ;
}
if ( pSurfTm == nullptr)
return false ;
vpSurfTm.emplace_back( pSurfTm) ;
}
// Controllo le tolleranze
dLinTol = max( dLinTol, LIN_TOL_MIN) ;
dMaxSegmLen = max( dMaxSegmLen, 10 * EPS_SMALL) ;
// Approssimo la curva con una polilinea alla massima risoluzione
PolyLine PL ;
if ( ! crCrv.ApproxWithLines( EPS_SMALL, ANG_TOL_STD_DEG, ICurve::APL_STD, PL))
return false ;
const double MAX_SEG_LEN = min( dMaxSegmLen, 0.977) ;
if ( ! PL.AdjustForMaxSegmentLen( MAX_SEG_LEN))
return false ;
// Pulisco e riservo spazio nel vettore dei punti risultanti
vPt5ax.clear() ;
vPt5ax.reserve( PL.GetPointNbr()) ;
// proietto i punti della polilinea sulla superficie con direzione normale alla curva di riferimento
double dPar ;
Point3d ptP ;
bool bFound = PL.GetFirstUPoint( &dPar, &ptP) ;
while ( bFound) {
// se trovo proiezione, la salvo
Point5ax Pt5ax ;
if ( ProjectPointOnSurf( ptP, vpSurfTm, crRef, dPar, Pt5ax))
vPt5ax.emplace_back( Pt5ax) ;
// passo al successivo
bFound = PL.GetNextUPoint( &dPar, &ptP) ;
}
// se richiesto, inserimento punti intermedi in presenza di spigoli
if ( bSharpEdges) {
for ( int i = 1 ; i < int( vPt5ax.size()) ; ++ i) {
// precedente
int j = i - 1 ;
// se normali tra corrente e precedente oltre limite e punti abbastanza lontani
if ( vPt5ax[i].vtDir1 * vPt5ax[j].vtDir1 < COS_ANG_MAX_CORNER &&
SqDist( vPt5ax[i].ptP, vPt5ax[j].ptP) > 25 * SQ_EPS_SMALL) {
// intersezione tra le due facce
Plane3d plPlane1 ; plPlane1.Set( vPt5ax[j].ptP, vPt5ax[j].vtDir1) ;
Plane3d plPlane2 ; plPlane2.Set( vPt5ax[i].ptP, vPt5ax[i].vtDir1) ;
Point3d ptEdge ; Vector3d vtEdge ;
if ( IntersPlanePlane( plPlane1, plPlane2, ptEdge, vtEdge) == IPPT_YES) {
Plane3d plPlane3 ; plPlane3.Set( vPt5ax[i].ptP, vPt5ax[i].vtDir2 ^ vPt5ax[j].vtDir2) ;
Point3d ptInt ;
if ( IntersLinePlane( ptEdge, vtEdge, 1, plPlane3, ptInt, false) == ILPT_YES) {
// verifico se spigolo convesso o concavo
bool bConvex ;
if ( ! AreSamePointApprox( ptInt, vPt5ax[j].ptP))
bConvex = ( ( vPt5ax[j].vtDir1 ^ ( ptInt - vPt5ax[j].ptP)) * vtEdge > 0) ;
else
bConvex = (( vPt5ax[i].vtDir1 ^ ( ptInt - vPt5ax[i].ptP)) * vtEdge < 0) ;
// se convesso, metto due punti con direzione appena prima e appena dopo
if ( bConvex) {
Vector3d vtLine1 = ptInt - vPt5ax[j].ptP ; double dLen1 = vtLine1.Len() ;
Vector3d vtLine2 = vPt5ax[i].ptP - ptInt ; double dLen2 = vtLine2.Len() ;
if ( dLen1 > 2 * EPS_SMALL) {
Point5ax Pt5ax ;
Pt5ax.ptP = ptInt - vtLine1 / dLen1 * 2 * EPS_SMALL ;
Pt5ax.vtDir1 = vPt5ax[j].vtDir1 ;
Pt5ax.vtDir2 = Media( vPt5ax[i].vtDir2, vPt5ax[j].vtDir2) ;
Pt5ax.dPar = ( vPt5ax[i].dPar + vPt5ax[j].dPar) / 2 ;
Pt5ax.nFlag = P5AX_CVEX ;
vPt5ax.insert( vPt5ax.begin() + i, Pt5ax) ;
++ i ;
}
if ( dLen2 > 2 * EPS_SMALL) {
Point5ax Pt5ax ;
Pt5ax.ptP = ptInt + vtLine2 / dLen2 * 2 * EPS_SMALL ;
Pt5ax.vtDir1 = vPt5ax[i].vtDir1 ;
Pt5ax.vtDir2 = Media( vPt5ax[i].vtDir2, vPt5ax[j].vtDir2) ;
Pt5ax.dPar = ( vPt5ax[i].dPar + vPt5ax[j].dPar) / 2 ;
Pt5ax.nFlag = P5AX_CVEX ;
vPt5ax.insert( vPt5ax.begin() + i, Pt5ax) ;
++ i ;
}
}
// altrimenti concavo, aggiungo un solo punto con la direzione media
else {
Point5ax Pt5ax ;
Pt5ax.ptP = ptInt ;
Pt5ax.vtDir1 = Media( vPt5ax[i].vtDir1, vPt5ax[j].vtDir1) ;
Pt5ax.vtDir2 = Media( vPt5ax[i].vtDir2, vPt5ax[j].vtDir2) ;
Pt5ax.dPar = ( vPt5ax[i].dPar + vPt5ax[j].dPar) / 2 ;
Pt5ax.nFlag = P5AX_CONC ;
vPt5ax.insert( vPt5ax.begin() + i, Pt5ax) ;
++ i ;
}
}
}
}
}
}
// rimozione punti in eccesso rispetto alle tolleranze
RemovePointsInExcess( vPt5ax, dLinTol, dMaxSegmLen, bSharpEdges) ;
return true ;
}
//----------------------------------------------------------------------------
static bool
ProjectPointOnSurf( const Point3d& ptP, const CISRFTMPVECTOR& vpStm, const SurfTriMesh& stmRef, double dPar, Point5ax& Pt5ax)
{
// punto sulla superficie guida a minima distanza
DistPointSurfTm dPS( ptP, stmRef) ;
Point3d ptMin ;
int nTriaMin ;
if ( dPS.GetMinDistPoint( ptMin) && dPS.GetMinDistTriaIndex ( nTriaMin)) {
// recupero direzione della retta di minima distanza, altrimenti normale alla superficie
Vector3d vtLine = ptP - ptMin ;
double dLineLen = vtLine.Len() ;
if ( dLineLen > EPS_SMALL)
vtLine /= dLineLen ;
else {
// calcolo la normale della superficie guida
Triangle3dEx trGuide ;
if ( ! stmRef.GetTriangle( nTriaMin, trGuide))
return false ;
if ( ! CalcNormal( ptMin, trGuide, vtLine))
vtLine = trGuide.GetN() ;
dLineLen = 100 ;
}
// intersezione della retta con le superfici (conservo l'intersezione più alta)
int nInd = -1 ;
IntLinStmInfo IntRes ;
for ( int i = 0 ; i < int( vpStm.size()) ; ++ i) {
ILSIVECTOR vIntRes ;
if ( IntersLineSurfTm( ptP, vtLine, dLineLen, *vpStm[i], vIntRes, false)) {
// cerco la prima intersezione valida a partire dall'ultima (è la più alta)
int nI = int( vIntRes.size()) - 1 ;
while ( nI >= 0 && abs( vIntRes[nI].dCosDN) < COS_ANG_LIM)
--nI ;
// se trovata
if ( nI >= 0) {
if ( nInd < 0) {
IntRes = vIntRes[nI] ;
nInd = i ;
}
else {
double dUref = (( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE) ? IntRes.dU2 : IntRes.dU) ;
double dU = (( vIntRes[nI].nILTT == ILTT_SEGM || vIntRes[nI].nILTT == ILTT_SEGM_ON_EDGE) ? vIntRes[nI].dU2 : vIntRes[nI].dU) ;
if ( dU > dUref) {
IntRes = vIntRes[nI] ;
nInd = i ;
}
}
}
}
}
// se trovata
if ( nInd >= 0) {
// calcolo il punto
Point3d ptInt ;
if ( IntRes.nILTT == ILTT_SEGM || IntRes.nILTT == ILTT_SEGM_ON_EDGE)
ptInt = IntRes.ptI2 ;
else
ptInt = IntRes.ptI ;
// calcolo la normale (si calcola smooth, in caso di errore si prende quella del triangolo)
Triangle3dEx trTria ;
if ( ! vpStm[nInd]->GetTriangle( IntRes.nT, trTria))
return false ;
Vector3d vtN ;
if ( ! CalcNormal( ptMin, trTria, vtN))
vtN = trTria.GetN() ;
// calcolo la normale della superficie guida
Triangle3dEx trGuide ;
if ( ! stmRef.GetTriangle( nTriaMin, trGuide))
return false ;
Vector3d vtN2 ;
if ( ! CalcNormal( ptMin, trGuide, vtN2))
vtN2 = trGuide.GetN() ;
// assegno valori al punto 5assi
Pt5ax.ptP = ptInt ;
Pt5ax.vtDir1 = vtN ;
Pt5ax.vtDir2 = vtN2 ;
Pt5ax.dPar = dPar ;
Pt5ax.nFlag = P5AX_STD ;
// ritorno con successo
return true ;
}
}
return false ;
}
//----------------------------------------------------------------------------
bool
ProjectCurveOnSurf( const ICurve& crCrv, const CISURFPVECTOR& vpSurf, const ISurf& sfRef,
double dLinTol, double dMaxSegmLen, bool bSharpEdges, PNT5AXVECTOR& vPt5ax)
{
// sistemazioni per tipo di superficie
CISRFTMPVECTOR vpSurfTm ;
for ( int i = 0 ; i < int( vpSurf.size()) ; ++ i) {
const SurfTriMesh* pSurfTm = nullptr ;
switch ( vpSurf[i]->GetType()) {
case SRF_TRIMESH :
pSurfTm = GetBasicSurfTriMesh( vpSurf[i]) ;
break ;
case SRF_BEZIER :
{ double dOldLinTol = GetSurfBezierAuxSurfRefinedTol() ;
SetSurfBezierAuxSurfRefinedTol( GetSurfBezierTol( dLinTol)) ;
pSurfTm = GetBasicSurfBezier( vpSurf[i])->GetAuxSurfRefined() ;
SetSurfBezierAuxSurfRefinedTol( dOldLinTol) ;
} break ;
case SRF_FLATRGN :
pSurfTm = GetBasicSurfFlatRegion( vpSurf[i])->GetAuxSurf() ;
break ;
default :
break ;
}
if ( pSurfTm == nullptr)
return false ;
vpSurfTm.emplace_back( pSurfTm) ;
}
// sistemazioni per tipo di superficie di riferimento
const SurfTriMesh* pRefTm = nullptr ;
switch ( sfRef.GetType()) {
case SRF_TRIMESH :
pRefTm = GetBasicSurfTriMesh( &sfRef) ;
break ;
case SRF_BEZIER :
{ double dOldLinTol = GetSurfBezierAuxSurfRefinedTol() ;
SetSurfBezierAuxSurfRefinedTol( GetSurfBezierTol( dLinTol)) ;
pRefTm = GetBasicSurfBezier( &sfRef)->GetAuxSurfRefined() ;
SetSurfBezierAuxSurfRefinedTol( dOldLinTol) ;
} break ;
case SRF_FLATRGN :
pRefTm = GetBasicSurfFlatRegion( &sfRef)->GetAuxSurf() ;
break ;
default :
break ;
}
if ( pRefTm == nullptr)
return false ;
// controllo le tolleranze
dLinTol = max( dLinTol, LIN_TOL_MIN) ;
dMaxSegmLen = max( dMaxSegmLen, 10 * EPS_SMALL) ;
// approssimo la curva con una polilinea entro la metà della tolleranza
PolyLine PL ;
if ( ! crCrv.ApproxWithLines( dLinTol, ANG_TOL_STD_DEG, ICurve::APL_STD, PL))
return false ;
const double MAX_SEG_LEN = min( dMaxSegmLen, 0.977) ;
if ( ! PL.AdjustForMaxSegmentLen( MAX_SEG_LEN))
return false ;
// Pulisco e riservo spazio nel vettore dei punti risultanti
vPt5ax.clear() ;
vPt5ax.reserve( PL.GetPointNbr()) ;
// proietto i punti della polilinea sulla superficie con direzione normale alla curva di riferimento
double dPar ;
Point3d ptP ;
bool bFound = PL.GetFirstUPoint( &dPar, &ptP) ;
while ( bFound) {
// se trovo proiezione, la salvo
Point5ax Pt5ax ;
if ( ProjectPointOnSurf( ptP, vpSurfTm, *pRefTm, dPar, Pt5ax))
vPt5ax.emplace_back( Pt5ax) ;
// passo al successivo
bFound = PL.GetNextUPoint( &dPar, &ptP) ;
}
// se richiesto, inserimento punti intermedi in presenza di spigoli
if ( bSharpEdges) {
for ( int i = 1 ; i < int( vPt5ax.size()) ; ++ i) {
// precedente
int j = i - 1 ;
// se normali tra corrente e precedente oltre limite e punti abbastanza lontani
if ( vPt5ax[i].vtDir1 * vPt5ax[j].vtDir1 < COS_ANG_MAX_CORNER &&
SqDist( vPt5ax[i].ptP, vPt5ax[j].ptP) > 25 * SQ_EPS_SMALL) {
// punto medio
Point3d ptMid = Media( vPt5ax[i].ptP, vPt5ax[j].ptP) ;
double dMid = ( vPt5ax[i].dPar + vPt5ax[j].dPar) / 2 ;
// se trovo proiezione, la salvo
Point5ax Pt5ax ;
if ( ProjectPointOnSurf( ptMid, vpSurfTm, *pRefTm, dMid, Pt5ax)) {
vPt5ax.insert( vPt5ax.begin() + i, Pt5ax) ;
-- i ;
}
}
}
}
// rimozione punti in eccesso rispetto alle tolleranze
RemovePointsInExcess( vPt5ax, dLinTol, dMaxSegmLen, bSharpEdges) ;
return true ;
}

Some files were not shown because too many files have changed in this diff Show More