本文整理汇总了C++中Matrix2d::lu方法的典型用法代码示例。如果您正苦于以下问题:C++ Matrix2d::lu方法的具体用法?C++ Matrix2d::lu怎么用?C++ Matrix2d::lu使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Matrix2d
的用法示例。
在下文中一共展示了Matrix2d::lu方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1:
//Check for passes through the left and right wall
vector<stick> make_ghost_lr( const vector<stick> &m, double LStick, int NumberMikado)
{
std::vector<stick> GhostLR;
for (int i=0;i<NumberMikado;i++){
if(m[i].th!=pi/2 || m[i].th!=3*pi/2){ // Check here for the left wall
stick ghostRowLR;
Matrix2d A; //The matrix to solve with
Vector2d b,b2; // A*st=b
Vector2d st,st2;
A<<-cos(m[i].th),0,-sin(m[i].th),1;
b<<m[i].x,m[i].y;
b2<<m[i].x-1,m[i].y;
st=A.lu().solve(b);
st2=A.lu().solve(b2);
if((st(0)>0 && st(0)<LStick) && (st(1)>0&&st(1)<1)){ //If mikado passes throug wall make ghost mikado
ghostRowLR=m[i];
ghostRowLR.x=ghostRowLR.x+1;
ghostRowLR.wlr=ghostRowLR.wlr-1;
GhostLR.push_back(ghostRowLR);
}
if((st2(0)>0&&st2(0)<LStick)&&(st2(1)>0&&st2(1)<1)){ //Now do the same for the upper wall
ghostRowLR=m[i];
ghostRowLR.x=ghostRowLR.x-1;
ghostRowLR.wlr=ghostRowLR.wlr+1;
GhostLR.push_back(ghostRowLR);
}
}
}
return GhostLR;
}
示例2: make_connections
//Checks whether the mikado's are connected
void make_connections(vector<connected> &Connection,
const vector<stick> &m,
double LStick,
const vector<spring> &background,
const VectorXd &XYb)
{
Matrix2d A; //The matrix to solve with
Vector2d b,st; // A*st=b
int nr=0;
connected xtrarow, xtrarow2;
//Loop over all sticks to find coordinates
for(int i=0;i<m.size()-1;i++){
for(int j=i+1;j<m.size();j++){
if(m[i].th!=m[j].th || m[i].nr!=m[j].nr){
A<<-cos(m[i].th),cos(m[j].th),-sin(m[i].th),sin(m[j].th);
b<<m[i].x-m[j].x,m[i].y-m[j].y;
st=A.lu().solve(b);
if ((st(0)>0.0 && st(0)<LStick)&&(st(1)>0.0 && st(1)<LStick)){
xtrarow.first=m[i].nr; //[stick i stick j sij sji]
xtrarow.second=m[j].nr;
xtrarow.s1=st(0);
xtrarow.s2=st(1);
xtrarow.nrCon=nr;
xtrarow.recur=0;
xtrarow.type=0;
xtrarow.backgroundspring[0]=-1;
xtrarow.backgroundspring[1]=-1;
xtrarow2.first=m[j].nr; //[stick j sticki sji sij]
xtrarow2.second=m[i].nr;
xtrarow2.s1=st(1);
xtrarow2.s2=st(0);
xtrarow2.nrCon=nr;
xtrarow2.recur=0;
xtrarow2.type=0;
xtrarow2.backgroundspring[0]=-1;
xtrarow2.backgroundspring[1]=-1;
Connection.push_back(xtrarow);
Connection.push_back(xtrarow2);
nr++;
}
}
}
}
//Now loop over the background springs
int one;
int two;
int number=XYb.size()/2;
double xsb,xse,ysb,yse,xmik,ymik;
double thspr, thmik;
double lenspring; //the coordinates + parameters of the spring
double s,t;
if(background.size()>0){//check wheather this block needs to be executed
for(int i=0; i<m.size();i++){
xmik=m[i].x;
ymik=m[i].y;
thmik=m[i].th;
for(int j=0;j<background.size();j++){
//calculate the intersections similar to the previous
one=background[j].one;
two=background[j].two;
xsb=XYb(one);
ysb=XYb(one+number);
xse=XYb(two)+background[j].wlr;
yse=XYb(two+number)+background[j].wud;
thspr=atan2((yse-ysb),(xse-xsb));
lenspring=sqrt(pow((yse-ysb),2)+pow((xse-xsb),2));
if(fabs(thspr-thmik)>1e-10 && fabs(fabs(thspr-thmik)-pi)>1e-10){
A<<cos(thmik),-cos(thspr),sin(thmik),-sin(thspr);
b<<xsb-xmik,ysb-ymik;
st=A.lu().solve(b);
s=st(0);
t=st(1);
if(s>0.0 && t>0.0 && s<LStick && t<lenspring){
//then we found a node!
xtrarow.first=m[i].nr;
xtrarow.second=-1; //the signature of a collision w spring
xtrarow.s1=s;
xtrarow.s2=t;
xtrarow.nrCon=nr;
xtrarow.type=1;
xtrarow.backgroundspring[0]=one;
xtrarow.backgroundspring[1]=two;
xtrarow.recur=0;
Connection.push_back(xtrarow);
nr++;
}
}
}
}
}
}