• Ce forum est la traduction générée par la machine de www.cad3d.it/forum1 - la communauté italienne du design. Plusieurs termes ne sont pas traduits correctement.

Créer des mailles polyhédriques à partir d'une série de points 3D en C#

PlannerRoad

Guest
su par l'interface c# code est disponible pour la compilation d'un utilitaire qui vous permet de créer simultanément un maillage polyédral à partir d'un ensemble de points 3d.

le code, pour, est le suivant:
PHP:
utilisation des services autodesk.autocad.application;
utilisation des services autodesk.autocad.database;
utilisant autodesk.autocad.runtime;
utilisant autodesk.autocad.editorinput;
utilisant autodesk.autocad.géométrie;
utilisation du système;

triangule de classe publique
{
la circonspection du sanglier public(
double x1, double y1, double x2,
double y2, double x3, double y3,
ref double xc, ref double yc, ref double r)
{
// calcul des coordonnées du cercle circonscrit et
// rayon carré

= 1e-6;
const double gros = 1e12;
bool result = true;
double m1, m2, mx1, mx2, my1, my2, dx, dy;

si ((math.abs(y1 - y2) < eps) && (math.abs(y2 - y3) < eps))
{
résultat = faux;
xc = x1; yc = y1; r = gros;
}
autre
{
si (math.abs(y2 - y1) < eps)
{
m2 = -(x3 - x2) / (y3 - y2);
mx2 = (x2 + x3) / 2;
my2 = (y2 + y3) / 2;
xc = (x2 + x1) / 2;
yc = m2 * (xc - mx2) + my2;
}
sinon si (math.abs(y3 - y2) < eps)
{
m1 = -(x2 - x1) / (y2 - y1);
mx1 = (x1 + x2) / 2;
my1 = (y1 + y2) / 2;
xc = (x3 + x2) / 2;
yc = m1 * (xc - mx1) + my1;
}
autre
{
m1 = -(x2 - x1) / (y2 - y1);
m2 = -(x3 - x2) / (y3 - y2);
si (mathe.abs(m1 - m2) < eps)
{
résultat = faux;
xc = x1;
yc = y1;
r = gros;
}
autre
{
mx1 = (x1 + x2) / 2;
mx2 = (x2 + x3) / 2;
my1 = (y1 + y2) / 2;
my2 = (y2 + y3) / 2;
xc = (m1 * mx1 - m2 * mx2 + my2 - my1) / (m1 - m2);
yc = m1 * (xc - mx1) + my1;
}
}
}
dx = x2 - xc;
dy = y2 - yc;
r = dx * dx + dy * dy;
le résultat du retour;
}

 [CommandMethod("TRIANG")]vide public triangulacommand()
{
const int maxpoints = 32767;

document doc =
la gestion des documents.
base de données db = doc.database;
éditeur ed = doc.editor;

valeur[] tvs = { nouvelle valeur dactylographiée(0, "point") };
filtre de sélection sf =
nouveau filtre de sélection(tvs);
invitesselectionoptions pso = nouvelles invitesselectionoptions();
pso.messageforadding = "choisir des points:";
pso.allowduplicates = faux;
inviteselectionresult psr = ed.getselection(pso, sf);

si (psr.status) revient;
si (psr.status) revient;

ss de sélection = valeur psr;
int npts = ss.count;
si (npts < 3)
{
ed.writemessage("3 points minimum doivent être sélectionnés!");
retour;
}
si (npts > points maxi)
{
ed.writemessage("nuber maximum de points dépassés!");
retour;
}

i, j, k, ntri, ned, status1 = 0, status2 = 0;
le statut de bool;

// coordonnées des points

double[] ptx = nouveau double[maxpoints + 3];
double[] pty = nouveau double[maxpoints + 3];
double[] ptz = nouveau double[maxpoints + 3];

définition des triangles

int[] pt1 = nouvelle int[maxpoints * 2 + 1];
Int[] pt2 = nouvelle int[maxpoints * 2 + 1];
Int[] pt3 = nouvelle int[maxpoints * 2 + 1];

// cercle circonscrit

double[] cex = nouveau double[maxpoints * 2 + 1];
double[] cey = nouveau double[maxpoints * 2 + 1];
double[] rad = nouveau double[maxpoints * 2 + 1];
double xmin, ymin, xmax, ymax, dx, dy, xmid, ymid;
Int[] ed1 = nouvelle int[maxpoints * 2 + 1];
Int[] ed2 = nouvelle int[maxpoints * 2 + 1];

objet[] idarray = ss.getobjectids();
transaction tr =
db.transactionmanager.starttransaction();
utilisant (tr)
{
dbpoint ent;
k = 0;
pour (i = 0; i < npts; i++)
{
ent =
(dbpoint)tr.getobjet(idarray)[k], en mode ouvert.forread, plié);
ptx[i] = dépréciation[0];
pté[i] = dépréciation[1];
Ptz[i] = dépréciation[2];
Verser (j = 0; m <; j+)
au[i] == Ptx[j]) & (pty)[i] == pté[j]))
{
i--; npts--; status2++;
}
k++;
}
l'engagement();
}

si (état2 > 0)
ed.writemessage(
"\nignoré {0} point(s) avec les mêmes coordonnées."
statut2
);

// supertriangle

xmin = ptx[0]xmax = xmin;
= pty[0]ymax = ym;
i = 0; i < npts; i++
{}
(Ptx)[i] < xmin = ptx[i];
comme (ptx)[i] > xmax = ptx[i];
oui (p[i] < xmin) ymin = pty[i];
oui (p[i] > xmin) ymax = pty[i];
}
dx = xmax - xmin; dy = ymax - ymin;
xmid = (xmin + xmax) / 2; ymid = (ymin + ymax) / 2;
i = npts;
ptx[i] = xmid - (90 * (dx + dy)) - 100;
pté[i] = ymid - (50 * (dx + dy)) - 100;
Ptz[i] = 0;
pt1[0] = i.
i++;
ptx[i] = xmid + (90 * (dx + dy)) + 100;
pté[i] = ymid - (50 * (dx + dy)) - 100;
Ptz[i] = 0;
pt2[0] = i.
i++;
ptx[i] = xmid;
pté[i] = ymid + 100 * (dx + dy + 1);
Ptz[i] = 0;
pt3[0] = i;
tris = 1;
circum (
ptx[pt1[0]], pty[pt1[0]], ptx[pt2[0]les
pté[pt2[0]], ptx[pt3[0]], pty[pt3[0]les
ref cex[0], avis[0], ref rad[0]);

// Boucle principal
pour (i = 0; i < npts; i++)
{
ned = 0;
xmin = ptx[i]; ymin = pty[i];
j = 0;
(j < trois)
{
dx = cex[j] - xmin; dy = cey[j] - Ymin;
Si ((dx * dx) + (dy * dy)) < rad[j])
{
ed1[ned] = pt1[j]; ed2[ned] = pt2[j];
ned++;
ed1[ned] = pt2[j]; ed2[ned] = pt3[j];
ned++;
ed1[ned] = pt3[j]; ed2[ned] = pt1[j];
ned++;
_
pt[j] = pt1[ntri];
pt2[j] = pt2[ntri];
pt3[j] = pt3[ntri];
cex[j] = cex[ntri];
Cey[j] = cey[ntri];
rad[j] = roue[ntri];
J--;
♪ Je serai là ♪
j++;
♪ Je serai là ♪

pour (j = 0; j < down - 1; j++)
verser (k = j + 1; k < down; k++)
(d1[j] == éd2 ==[k]) & &amp; (ed2[j] il s'agit d'un cas particulier.[k]))
{
ed1[j] = -1; ed2[j] = -1; ed1[k] = -1; ed2[k] = -1;
♪ Je serai là ♪

pour (j = 0; j < down; j++)
(d1[j] >= 0) && (ed2[j] > = 0)
♪
pt1[ntri] = ed1[j]; pt2[ntri] = ed2[j]; pt3[ntri] = i;
État =
circum(
ptx[pt1[ntri]], pty[pt1[ntri]], ptx[pt2[ntri]les
pté[pt2[ntri]], ptx[pt3[ntri]], pty[pt3[ntri]les
ref cex[ntri], avis[ntri], ref rad[ntri]);
si (!status)
{
statut1++;
}
ntri++;
}
}

// enlèvement des triangles extérieurs
i = 0;
alors que (i < ntri)
{
si (pt1[i] > npt)[i] > npt)[i] >= npts)
{
ntri--;
pt1[i] = pt1[ntri];
pt2[i] = pt2[ntri];
pt3[i] = pt3[ntri];
cex[i] = cex[ntri];
Cey[i] = cey[ntri];
rad[i] = roue[ntri];
i--;
}
i++;
}

tr = db.transactionmanager.starttransaction();
utilisant (tr)
{
blocktable bt =
(blocktable)tr.getobject(
blocktableid,
mode ouvert. à l'avance,
faux
);
blocktablerecord btr =
(blocktablerecord)tr.getobject(
bt[BlockTableRecord.ModelSpace],
mode ouvert. par écrit,
faux
);

polyfacemesh pfm = nouveau polyfacemesh();
annexe btr (pfm);
tr.addnewlycreateddbobject(pfm, true);
pour (i = 0; i < npts; i++)
{
polyfacemeshvertex vert =
nouveau polyfacemeshvertex(
nouveau point3d(ptx[i], pty[i], pt[i])
);
pfm.appendvertex(vert);
tr.addnewlycreateddbobject(vert, true);
}
pour (i = 0; i < ntri; i++)
{
face d'enregistrement =
nouveau enregistrement de la face(
(courte)pt1[i] + 1,
(applaudissements)[i] + 1,
(applaudissements)[i] + 1),
0
);
pfm.appendfacerecord(face);
tr.addnewlycreateddbobject(face, true);
}
l'engagement();
}
si (état1 > 0)
ed.writemessage(
"au secours ! {0} triangle(s) mince(s) trouvé(s)!" +
"un mauvais résultat possible!",
statut1
);
application.updatescreen();
}
}
la commande de l'utilitaire est sommaire.comment remplir le code: dans ce débat c# visuel: remplissez le code pour autocad j'ai expliqué la procédure et indiqué le logiciel pour compiler c#.

après avoir téléchargé l'utilitaire avec la commande netload, en donnant la commande triang, vous pouvez sélectionner un ensemble de points 3d et, à partir de la triangulation de ceux-ci, obtenir la maille polyhedra.

j'ai joint le code que j'ai compilé.
 

Pièces jointes

Statistiques du forum

Sujets
58 521
Messages
499 056
Membres
104 110
Dernier membre
ChristianR

Membres en ligne

Aucun membre en ligne actuellement.
Retour
Haut