minor changes

This commit is contained in:
Nico Pietroni 2005-04-20 15:20:13 +00:00
parent 08f4270101
commit ab6ca78ee1
6 changed files with 174 additions and 96 deletions

View File

@ -30,10 +30,14 @@ int main( int argc, char ** argv )
#ifdef _TORUS
w.simpleGLWidget1->SetExtractionParameters();
s->BBox().min=Point3f(0.f,0.f,0.f);
s->BBox().max=Point3f(300.f,300.f,300.f);
s->InitSegmentation(Point3f(0.f,100.f,0.f));
//w.simpleGLWidget1->SetExtractionParameters();
//s->SetSegmentParameters(10,0.5f,0.2f,0.8f,0.4f,3.f,vcg::Point3f(1.f,1.f,1.f),1000,15);
s->SetSegmentParameters(10,0.5f,0.8f,0.65f,0.4f,3.f,vcg::Point3f(1.f,1.f,1.f),1000,15);
s->BBox().min=Point3f(-40.f,-40.f,-40.f);
s->BBox().max=Point3f(40.f,40.f,40.f);
s->InitSegmentation(Point3f(0.f,25.f,0.f));
w.simpleGLWidget1->CenterExtraction=vcg::Point3f(0.f,-25.f,0.f);
s->gray_init=100;
#endif

View File

@ -16,7 +16,10 @@ SOURCES += D:/sf/wrap/gui/trackmode.cpp \
main.cpp
FORMS = segmentform.ui \
d:\sf\apps\test\segmentation3d\segmentform.ui
IMAGES = D:/sf/apps/test/segmentation3d/slider.jpg

View File

@ -128,19 +128,24 @@ public:
((V(1)->blocked)||(V(1)->stopped))&&
((V(2)->blocked)||(V(2)->stopped))))&&(!intersected));
}
bool HaveVertexActive()
{
return((V(0)->blocked==false)||(V(1)->blocked==false)||(V(2)->blocked==false));
}
bool IsBlocked()
{
return((V(0)->blocked)&&(V(1)->blocked)&&(V(2)->blocked));
}
double DiedralAngle(int edge)
{
MyFace *fopp=FFp(edge);
CoordType norm1=NormalizedNormal();
CoordType norm2=fopp->NormalizedNormal();
return (NormalizedNormal()*fopp->NormalizedNormal());
return (norm1*norm2);
}
///return the bounding box of the simplex
@ -151,10 +156,15 @@ public:
return (bb);
}
ScalarType ForceValue(ScalarType l0,ScalarType l1)
{
return ((l0-l1)/(l0/l1) *_k);
}
///update of the internal forces using the dihedral angle
bool Update ( void )
{
if (!IsD())//if this face is not deleted
if (!IsD()&&(!intersected))//if this face is not deleted
{
for (int i=0;i<3;i++)
{
@ -166,28 +176,30 @@ public:
assert(!fopp->IsD());
assert(fopp!=this);
if ((fopp<myAddr))//test do not duplicate updates per edge
if ((fopp<myAddr)&&(!fopp->intersected))//test do not duplicate updates per edge
{
//normal and area based diadedral angle calcolus
CoordType DirEdge=(V(i)->P()-V((i+1)%3)->P()).Normalize();
fopp=FFp(i);
CoordType Ver=(NormalizedNormal()^fopp->NormalizedNormal()).Normalize();
ScalarType diaedral=DiedralAngle(i);
ScalarType Force=(((-diaedral)+1.f)*kdihedral);
CoordType VectF=NormalizedNormal()*(Force);
if ((Ver*DirEdge)<=0)///convex
{
ScalarType Force=(((-diaedral)+1.f)*kdihedral);
V((i+2)%3)->IntForce()+=NormalizedNormal()*(Force);
V(i)->IntForce()-=NormalizedNormal()*(Force)/2.f;
V((i+1)%3)->IntForce()-=NormalizedNormal()*(Force)/2.f;
{
V((i+2)%3)->IntForce()+=VectF;
fopp->V((FFi(i)+2)%3)->IntForce()+=VectF;///opposite vertex
V(i)->IntForce()-=VectF;
V((i+1)%3)->IntForce()-=VectF;
}
else ///non-convex
{
ScalarType Force=(((-diaedral)+1.f)*kdihedral);
V((i+2)%3)->IntForce()-=NormalizedNormal()*(Force);
V(i)->IntForce()+=NormalizedNormal()*(Force)/2.f;
V((i+1)%3)->IntForce()+=NormalizedNormal()*(Force)/2.f;
V((i+2)%3)->IntForce()-=VectF;
fopp->V((FFi(i)+2)%3)->IntForce()-=VectF;///opposite vertex
V(i)->IntForce()+=VectF;
V((i+1)%3)->IntForce()+=VectF;
}
}
}
}
@ -253,6 +265,7 @@ public:
int gray_init;
float time_stamp;
float edge_precision;
float edge_init;
bool end_loop;
bool refined;
@ -307,18 +320,43 @@ private:
#ifdef _TORUS
///torus version
/*float getColor(MyTriMesh::CoordType p)
{
static float ray=25.f;
static float diameter=4.f;
float dist=p.Norm();
float difference=abs(ray-dist);
float z=fabs(p.Z());
if((difference<diameter)&&(z<diameter))
return (100.f);
else
return (0.f);
}*/
bool InTorus(MyTriMesh::CoordType p)
{
static float ray=25.f;
static float diameter=4.f;
double fatt=(p.X()*p.X()+p.Y()*p.Y());
double fatt1=(ray-math::Sqrt(fatt));
double fatt2=fatt1*fatt1+p.Z()*p.Z();
double conf=diameter*diameter;
///now swap
return (fatt2<=conf);
}
float getColor(MyTriMesh::CoordType p)
{
static float ray=100.f;
static float diameter=20.f;
Point3f center=BBox().Center();
float dist=(p-center).Norm();
float difference=abs(ray-dist);
if(difference<diameter)
return 100.f;
MyTriMesh::CoordType p1=MyTriMesh::CoordType(p.X(),p.Z(),p.Y());
//MyTriMesh::CoordType p2=MyTriMesh::CoordType(p.Z(),p.Y(),p.X());
if (InTorus(p)||InTorus(p1))//||InTorus(p2))
return (100.f);
else
return (100.f+difference*5.f);
return (0.f);
}
#else
///return integer coordinete in volumetric dataset
float getColor(MyTriMesh::CoordType p)
@ -492,7 +530,6 @@ void InitMesh(MyTriMesh *m)
// P_Vertex.push_back(&m.vert[i]);
}
vcg::tri::UpdateNormals<MyTriMesh>::PerVertexNormalized(*m);
}
@ -531,7 +568,7 @@ MyTriMesh::CoordType GradientFactor(MyTriMesh::VertexType *v)
void AddExtForces()
{
Part_VertexContainer::iterator vi;
PartialUpdateNormals();
//PartialUpdateNormals();
end_loop=true;
for (vi=P_Vertex.begin();vi<P_Vertex.end();++vi)
{
@ -556,10 +593,9 @@ void AddExtForces()
{
MyTriMesh::CoordType Inflating=(*vi).N();
MyTriMesh::CoordType Containing0=ContainingForce(&*vi);
//MyTriMesh::CoordType Containing1=GradientFactor(&*vi);
Containing0*=0.75;
if (Containing0.Norm()>1)
Containing0.Normalize();
Containing0*=0.75;
(*vi).ExtForce()=Inflating+Containing0;/*+Containing1+Containing0*/;
}
}
@ -682,6 +718,8 @@ bool TimeSelfIntersection()
void PartialUpdateNormals()
{
//vcg::tri::UpdateNormals<MyTriMesh>::PerFaceNormalized(*m);
//vcg::tri::UpdateNormals<MyTriMesh>::PerVertexNormalized(*m);
Part_FaceContainer::iterator fi;
for (fi=P_Faces.begin();fi<P_Faces.end();++fi)
if (!(*fi).IsD())
@ -725,7 +763,7 @@ struct MyMidPoint:vcg::MidPoint<MESH_TYPE>
nv.P()= (ep.f->V(ep.z)->P()+ep.f->V1(ep.z)->P())/2.0;
nv.RPos()=(ep.f->V(ep.z)->RPos()+ep.f->V1(ep.z)->RPos())/2.0;
if( MESH_TYPE::HasPerVertexNormal())
nv.N()= (ep.f->V(ep.z)->N()+ep.f->V1(ep.z)->N()).Normalize();
@ -768,6 +806,7 @@ void RefineStep(float _edge_size)
}
/*vcg::tri::UpdateNormals<MyTriMesh>::PerFaceNormalized(*m);
vcg::tri::UpdateNormals<MyTriMesh>::PerVertexNormalized(*m);*/
PartialUpdateNormals();
//#ifdef _DEBUG
@ -783,15 +822,22 @@ void ReinitPhysicMesh()
{
Part_FaceContainer::iterator pfi;
for (pfi=P_Faces.begin();pfi<P_Faces.end();++pfi)
/*for (pfi=P_Faces.begin();pfi<P_Faces.end();++pfi)
if((!(*pfi).IsD())&&((!(*pfi).intersected)))
(*pfi).Init(k_elanst,mass,k_dihedral);
(*pfi).Init(k_elanst,mass,k_dihedral);*/
Part_VertexContainer::iterator pvi;
for (pvi=P_Vertex.begin();pvi<P_Vertex.end();++pvi)
if(!(*pvi).IsD())
(*pvi).SetRestPos();
for (pfi=P_Faces.begin();pfi<P_Faces.end();++pfi)
if((!(*pfi).IsD())&&((!(*pfi).intersected)))
(*pfi).Init(k_elanst,mass,k_dihedral);
//PartialUpdateNormals();
/*for (MyTriMesh::VertexIterator vi=m.vert.begin();vi<m.vert.end();vi++)
ClearStopped(&*vi);*/
}
@ -851,7 +897,7 @@ void LoadFromDir(char *in, char *out)
///set parameters for segmentation
void SetSegmentParameters(int tol,float Mass=0.5f,float K_elanst=0.2f,float Dihedral=0.2f,float Time_stamp=0.2f,
float Edge_precision=4.f,Point3f ScaleFactor=Point3f(1.f,1.f,1.f),
clock_t _interval=1000,clock_t _interval2=250)
clock_t _interval=2000,clock_t _interval2=250)
{
mass=Mass;
k_elanst=K_elanst;
@ -861,6 +907,7 @@ void SetSegmentParameters(int tol,float Mass=0.5f,float K_elanst=0.2f,float Dihe
interval_selfcollision=_interval2;
edge_size=16.f;
edge_init=edge_size;
edge_precision=Edge_precision;
time_stamp=Time_stamp;
k_dihedral=Dihedral;
@ -890,7 +937,7 @@ void InitSegmentation(MyTriMesh::CoordType b)
}
///return the bounding box of the mesh
vcg::Box3<float> BBox()
vcg::Box3<float>& BBox()
{
return (bbox);
}
@ -934,25 +981,40 @@ void AutoStep()
}
}
/////set as deleted intersected vertices
//void ClearIntersectedFaces()
//{
// MyTriMesh::FaceIterator fi;
// for (fi=m->face.begin();fi<m->face.end();fi++)
// if ((*fi).intersected==true)
// (*fi).SetD();
//
//}
///set as deleted intersected vertices
void ClearIntersectedFaces()
{
MyTriMesh::FaceIterator fi;
for (fi=m->face.begin();fi<m->face.end();fi++)
#ifdef _TORUS
if (((*fi).intersected==true))///||((*fi).HaveVertexActive()))
{
m->fn--;
(*fi).SetD();
}
#else
if (((*fi).intersected==true))//||((*fi).HaveVertexActive()))
{
m->fn--;
(*fi).SetD();
}
#endif
}
///first version
void Resample()
{
//ClearIntersectedFaces();
ClearIntersectedFaces();
new_m=new MyTriMesh();
vcg::tri::UpdateBounding<MyTriMesh>::Box(*m);
#ifdef _TORUS
vcg::trimesh::Resampler<MyTriMesh,MyTriMesh>::Resample<vcg::trimesh::RES::MMarchingCubes>(*m,*new_m,
Point3i((int) edge_precision,(int) edge_precision,(int) edge_precision));
Point3i((int) edge_precision,(int) edge_precision,(int) edge_precision),edge_init);
#else
vcg::trimesh::Resampler<MyTriMesh,MyTriMesh>::Resample<vcg::trimesh::RES::MMarchingCubes>(*m,*new_m,
Point3i((int) edge_precision,(int) edge_precision,(int) edge_precision),edge_size*2.f);
#endif
// delete(new_m0);
delete(m);
m=new_m;

View File

@ -514,36 +514,6 @@
<number>1</number>
</property>
</widget>
<widget class="QLineEdit">
<property name="name">
<cstring>T_step</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>210</y>
<width>70</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="frameShape">
<enum>LineEditPanel</enum>
</property>
<property name="frameShadow">
<enum>Sunken</enum>
</property>
<property name="text">
<string>0.2</string>
</property>
<property name="cursorPosition">
<number>3</number>
</property>
</widget>
<widget class="QPushButton">
<property name="name">
<cstring>SmoothButton</cstring>
@ -752,13 +722,40 @@
<height>31</height>
</rect>
</property>
<property name="pixmap">
<pixmap>slider.jpg</pixmap>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
<widget class="QLineEdit">
<property name="name">
<cstring>T_step</cstring>
</property>
<property name="geometry">
<rect>
<x>30</x>
<y>210</y>
<width>70</width>
<height>31</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="frameShape">
<enum>LineEditPanel</enum>
</property>
<property name="frameShadow">
<enum>Sunken</enum>
</property>
<property name="text">
<string>0.4</string>
</property>
<property name="cursorPosition">
<number>3</number>
</property>
</widget>
</widget>
</hbox>
</widget>

View File

@ -293,12 +293,17 @@ void SimpleGLWidget::glDraw(){
if (s->m!=NULL)
{
//vcg::tri::UpdateBounding<Segmentator::MyTriMesh>::Box(*(s->m));
#ifndef _TORUS
vcg::Point3f p=s->m->bbox.Center();
#endif
TrackM.GetView();
TrackM.Apply();
TrackM.Draw();
glScalef(1.f/s->m->bbox.Diag(),1.f/s->m->bbox.Diag(),1.f/s->m->bbox.Diag());
//glScalef(1.f/s->m->bbox.Diag(),1.f/s->m->bbox.Diag(),1.f/s->m->bbox.Diag());
#ifndef _TORUS
glTranslate(-p);
#endif
//glTranslate(-CenterExtraction);
//glScalef(1.f/s->m->bbox.Diag(),1.f/s->m->bbox.Diag(),1.f/s->m->bbox.Diag());
}
}
@ -348,7 +353,7 @@ void SimpleGLWidget::glDraw(){
*/
glColor3d(0.4,0.8,0.8);
if (fi->intersected)
if ((fi->intersected)&&(wire))
glColor3d(1.f,0,0);
if (((blocked)&&(!fi->IsBlocked()))||(!blocked))
@ -442,6 +447,9 @@ void SimpleGLWidget::mousePressEvent ( QMouseEvent * e )
*/
UpdateBBMesh();
TrackM.MouseDown(e->x(),_H-e->y(),vcg::Trackball::BUTTON_LEFT);
#ifndef _TORUS
CenterExtraction=s->m->bbox.Center();
#endif
}
else if (_showslides)
TrackS.MouseDown(e->x(),_H-e->y(),vcg::Trackball::BUTTON_LEFT);

View File

@ -32,11 +32,13 @@ private :
bool resultForces;
bool continue_int;
GLuint texName;
//Segmentator *s;
//QTimer *timer;
//vcg::GlTrimesh<Segmentator::MyTriMesh> *Wrap;
public:
vcg::Point3f CenterExtraction;
QString path;
SegmentForm *w;
SimpleGLWidget( QWidget * parent = 0, const char * name = 0, const QGLWidget * shareWidget = 0, WFlags f = 0 );
@ -129,20 +131,20 @@ public:
void Extract()
{
UpdateBBMesh();
//UpdateBBMesh();
continue_int=!continue_int;
if (continue_int)
{
_showslides=false;
w->SlidesButton->setOn(false);
//((SegmentForm *)this->parent())->SlidesButton->setOn(false);
}
else
{
_showslides=true;
w->SlidesButton->setOn(true);
//((SegmentForm *)this->parent())->SlidesButton->setOn(true);
}
//if (continue_int)
//{
// _showslides=false;
// w->SlidesButton->setOn(false);
// //((SegmentForm *)this->parent())->SlidesButton->setOn(false);
//}
//else
//{
// _showslides=true;
// w->SlidesButton->setOn(true);
// //((SegmentForm *)this->parent())->SlidesButton->setOn(true);
//}
repaint();
}
@ -161,7 +163,9 @@ public:
void CleanMesh()
{
MarchingCube();
#ifndef _TORUS
UpdateBBMesh();
#endif
repaint();
}