...
 
Commits (2)
......@@ -19,3 +19,4 @@
*.mat
*.zip
*.m~
......@@ -56,19 +56,27 @@
% \AdresseCourteAuteurI ...
%---------------------------------------------------------------
% DEFINIR ICI LE TITRE DE VOTRE COMMUNICATION
\def\Titre{Titre de la communication}
\def\Titre{A provably robust algorithm for triangle intersections}
%
% DEFINIR ICI LES NOMS, ADRESSES, ... DE l'ORATEUR OU UNIQUE AUTEUR
\def\NomOrateur{Pr\'enom NOM}
\def\AdresseCourteOrateur{Adresse Courte}
\def\AdresseLongueOrateur{Adresse Longue}
\def\EmailOrateur{email}
\def\NomOrateur{Conor MCCOID}
\def\AdresseCourteOrateur{Universit\'e de Gen\`eve}
\def\AdresseLongueOrateur{Universit\'e de Gen\`eve,
Section de math\'ematiques,
2-4 rue du Li\`evre,
Case postale 64,
1211 Gen\`eve 4, Suisse}
\def\EmailOrateur{conor.mccoid@unige.ch}
%
% DEFINIR ICI LES NOMS, ADRESSES, ... DES EVENTUELS CO-AUTEURS
\def\NomAuteurI{Pr\'enom NOM}
\def\AdresseCourteAuteurI{Adresse Courte}
\def\AdresseLongueAuteurI{Adresse Longue}
\def\EmailAuteurI{email}
\def\NomAuteurI{Martin J. GANDER}
\def\AdresseCourteAuteurI{Universit\'e de Gen\`eve}
\def\AdresseLongueAuteurI{Universit\'e de Gen\`eve,
Section de math\'ematiques,
2-4 rue du Li\`evre,
Case postale 64,
1211 Gen\`eve 4, Suisse}
\def\EmailAuteurI{martin.gander@unige.ch}
%=== et ainsi de suite II, III, IV, V ... pour les suivants
%
%=== Liste des mots-cles separes par des virgules si besoin
......@@ -90,7 +98,7 @@
%---------------------------------------------------------------
\orateur{\NomOrateur}{\AdresseCourteOrateur}
% NE PAS MODIFIER LES 4 LIGNES SUIVANTES sauf a retirer le signe commentaire '%'
%\auteur{\NomAuteurI}{\AdresseCourteAuteurI}
\auteur{\NomAuteurI}{\AdresseCourteAuteurI}
%\auteur{\NomAuteurII}{\AdresseCourteAuteurII}
%\auteur{\NomAuteurIII}{\AdresseCourteAuteurIII}
%\auteur{\NomAuteurIV}{\AdresseCourteAuteurIV}
......@@ -100,22 +108,8 @@
% TEXTE DE LA COMMUNICATION
%---------------------------------------------------------------
Texte de la communication avec ses r\'ef\'erences
bibliographiques \'even\-tuelles \cite{ref1}\cite{ref2}.\\
Motivated by an unexpected failure of a previous algorithm, we've developed a new 2D triangle-triangle intersection algorithm that is backwards stable. Most importantly, the algorithm will always produce an intersection of similar shape and size to the expected result. The main idea of the new algorithm is that all geometric quantities needed for determining the intersection are based on the same underlying floating point computation, so inconsistencies can not arise any more. This creates an asymmetry between the two triangles: The numerical geometry of U intersecting V is not the same as that of V intersecting U. \\
%---------------------------------------------------------------
% REFERENCES BIBLIOGRAPHIQUES
%---------------------------------------------------------------
% NE PAS MODIFIER LES 2 LIGNES SUIVANTES
\bibliographystyle{plain}
\begin{thebibliography}{99}
\bibitem{ref1} {\sc Auteur}, {\sl Titre}, Editeur, ann\'ee.
\bibitem{ref2} {\sc Auteur}, {\sl Titre}, Revue, r\'ef\'erences, ann\'ee.
% NE PAS MODIFIER LA LIGNE SUIVANTE
\end{thebibliography}
%
%---------------------------------------------------------------
% NOM & ADRESSE COMPLETE & EMAIL DU OU DES AUTEURS
......@@ -127,10 +121,11 @@ bibliographiques \'even\-tuelles \cite{ref1}\cite{ref2}.\\
% Les noms, adresses, email de l'orateur et des co-auteurs sont a definir
% dans les macros \NomOrateur, \AdresseCourteOrateur etc. plus haut
%
%\auteurenbasdepage{\NomAuteurI}{\AdresseLongueAuteurI}{\EmailAuteurI}
\auteurenbasdepage{\NomAuteurI}{\AdresseLongueAuteurI}{\EmailAuteurI}
%\auteurenbasdepage{\NomAuteurII}{\AdresseLongueAuteurII}{\EmailAuteurII}
%\auteurenbasdepage{\NomAuteurIII}{\AdresseLongueAuteurIII}{\EmailAuteurIII}
%\auteurenbasdepage{\NomAuteurIV}{\AdresseLongueAuteurIV}{\EmailAuteurIV}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\end{document}
\grid
\grid
......@@ -53,14 +53,6 @@ function [P,n,M]=Intersect(X,Y)
% points on the boundary and removing duplicates at the end.
[P,Q,R,n] = Geometry(X,Y);
% figure(2)
% plot(P(1,:),P(2,:),'k^',Q(1,:),Q(2,:),'rx',R(1,:),R(2,:),'bo')
% triX = [ X , X(:,1)];
% triY = [ Y , Y(:,1)];
% hold on
% plot(triX(1,:),triX(2,:),'-',triY(1,:),triY(2,:),'-')
% hold off
% pause(1)
if size(P,2)>1 % if two or more interior points
n=[1,1,1]; % the triangle is candidate for all
end % neighbors
......@@ -78,6 +70,12 @@ if size(P,2)>0
% set(H,'LineWidth',3,'Color','m');
pause(0)
end
% figure(2)
% triX = [ X , X(:,1)];
% triY = [ Y , Y(:,1)];
% plot(triX(1,:),triX(2,:),'-',triY(1,:),triY(2,:),'-')
% pause(0)
end
function [P,Q,R,n] = Geometry(U,V)
......@@ -170,12 +168,8 @@ for i = 1:3
ind(i) = 1;
end
if exist('qold','var') % test if 1st intersect. already calculated
if sign(qold)~=sign(q0)
indR(R1) = 1;
end
if sign(qold-1)~=sign(q0-1)
indR(R2) = 1;
end
indR(R1) = indR(R1) | sign(qold)~=sign(q0);
indR(R2) = indR(R2) | sign(qold-1)~=sign(q0-1);
end
qold = q0;
end
......
This diff is collapsed.
function [P,Q,R,n]=RefFree(U,V)
% REFFREE intersection of two triangles
W=V(:,[2,3,1])-V;
n=zeros(1,3); indR=n; indP=ones(1,3);
Q=zeros(2,9); indQ=zeros(1,9);
for i=1:3
j=mod(i,3)+1; w=W(:,i); wt=[-w(2);w(1)];
if wt'*W(:,j)<0
wt=-wt;
end
qp=[w,wt]\(U-V(:,i)); sp=sign(qp(2,:))>=0; qold=NaN;
for k=1:3
l=mod(k,3)+1; m=k+3*(i-1);
if sp(k)~=sp(l) % vertices on opposite sides of edge?
q0=(qp(1,k)*qp(2,l)-qp(1,l)*qp(2,k))/(qp(2,l)-qp(2,k));
if q0>=0 && q0<=1 % intersection lies on edge of Y?
Q(:,m)=V(:,i)+q0*w; indQ(m)=1;
n(k)=1;
end
if isnan(qold) % 1st intersection not calculated?
qold=q0;
else
indR(i)=indR(i)|sign(qold)~=sign(q0); % 0 in [q0,qold]?
indR(j)=indR(j)|sign(qold-1)~=sign(q0-1); % 1 in [q0,qold]?
end
end
end
indP=indP.*sp;
end
P=U(:,indP==1); Q=Q(:,indQ==1); R=V(:,indR==1);
\ No newline at end of file
[N,T,Np]=CircleMesh(20,1e-16);
%%
figure(1)
clf
PlotMesh(N,T,'b')
PlotMesh(Np,T,'r')
M = InterfaceMatrix(N,T,Np,T);
pause(5)
pause(1)
% savefig('CirclePANG.fig')
%%
clf
PlotMesh(N,T,'b')
PlotMesh(Np,T,'r')
M = InterfaceMatrixNew(N,T,Np,T);
pause(1)
% savefig('CircleNew.fig')
%%
clf
PlotMesh(N,T,'b')
PlotMesh(Np,T,'r')
hold on
M = InterfaceMatrixRF(N,T,Np,T);
hold off
% savefig('CircleNew.fig')
\ No newline at end of file