bool inCircle(Point* a, Point* b, Point* c, Point* d) {
	long a2 = a->getX()*a->getX() + a->getY()*a->getY();
	long b2 = b->getX()*b->getX() + b->getY()*b->getY();
	long c2 = c->getX()*c->getX() + c->getY()*c->getY();
	long d2 = d->getX()*d->getX() + d->getY()*d->getY();

	long det44 = 0;
	det44 += d2  * det33(a->getX(), a->getY(), 1, b->getX(), b->getY(), 1, c->getX(), c->getY(), 1);
	det44 -= d->getX() * det33(a2, a->getY(), 1, b2, b->getY(), 1, c2, c->getY(), 1);
	det44 += d->getY() * det33(a2, a->getX(), 1, b2, b->getX(), 1, c2, c->getX(), 1);
	det44 -= 1 * det33(a2, a->getX(), a->getY(), b2, b->getX(), b->getY(), c2, c->getX(), c->getY());

	if(det44 < 0)
		return true;
	return false;
}
예제 #2
0
int
PFEMElement3D::update()
{
    //  get nodal coordinates 
    Matrix A(4,4);
    for(int i=0; i<4; i++) {
        const Vector& coord = nodes[2*i]->getCrds();
        const Vector& disp = nodes[2*i]->getTrialDisp();
        A(i,0) = 1.0;
        for(int j=1; j<4; j++) {
            A(i,j) = coord(j-1) + disp(j-1);
        }
    }

    // get jacobi
    Matrix coef(4,4), sub(3,3);
    Vector jacobi(4);
    for(int i=0; i<4; i++) {
        for(int j=0; j<4; j++) {

            // sub matrix
            for(int k=0; k<4; k++) {
                if(k==i) continue;
                int k1 = k;
                if(k>i) k1--;
                for(int l=0; l<4; l++) {
                    if(l==j) continue;
                    int l1 = l;
                    if(l>j) l1--;
                    sub(k1,l1) = A(k,l);
                }
            }

            // cofactor
            int sign = 1;
            if((i+j)%2 == 1) sign = -1;
            coef(i,j) = sign*det33(sub);
            jacobi(i) += coef(i,j) * A(i,j);
        }
    }

    // opserr<<"J = "<<jacobi;
    J = jacobi(0);

    // if(fabs(J) <= 1e-6) {
    //     opserr<<"WARNING: zero Jacobian for element ";
    //     opserr<<J<<" --PFEMElement3D::update\n";
    //     //return -1;
    // }

    // get derivatives
    for(int i=0; i<4; i++) {
        dNdx[i] = coef(i,1)/J;
        dNdy[i] = coef(i,2)/J;
        dNdz[i] = coef(i,3)/J;
        //opserr<<"dNdx = "<<dNdx[i]<<"\n";
    }

    return 0;
}
예제 #3
0
파일: touchscreen.c 프로젝트: S010/misc
/* 
 * Compute inverse matrix of 3x3 matrix 'in'.
 * Return true if successful.
 */
bool
invert33(const float in[3][3], float out[3][3])
{
	float	 d;
	float	 d_i;

	d = det33(in);
	if (d == 0)
		return false;
	d_i = 1.0 / d;

#define D(							\
		a_i, a_j,  b_i, b_j,				\
		c_i, c_j,  d_i, d_j				\
	)							\
		det22(in[a_i-1][a_j-1], in[b_i-1][b_j-1],	\
		    in[c_i-1][c_j-1], in[d_i-1][d_j-1])

	float	 a[3][3] = {
		/* row 0 */
		{
			D(2,2, 2,3,
			  3,2, 3,3),
			D(1,3, 1,2,
			  3,3, 3,2),
			D(1,2, 1,3,
			  2,2, 2,3)
		},
		/* row 1 */
		{
			D(2,3, 2,1,
			  3,3, 3,1),
			D(1,1, 1,3,
			  3,1, 3,3),
			D(1,3, 1,1,
			  2,3, 2,1)
		},
		/* row 2 */
		{
			D(2,1, 2,2,
			  3,1, 3,2),
			D(1,2, 1,1,
			  3,2, 3,1),
			D(1,1, 1,2,
			  2,1, 2,2)
		},
	};

#undef D

	int	 i, j;
	for (i = 0; i < 3; i++)
		for (j = 0; j < 3; j++)
			out[i][j] = d_i * a[i][j];

	return true;
}
void VSObjectTransformation::applyToKspace(double &kx,double &ky,double &kz,double &phase_offset,double &scale_factor) const {
	scale_factor=det33(m_data);
	phase_offset=(m_data[0][3]*kx+m_data[1][3]*ky+m_data[2][3]*kz)*360; //perhaps multiply by -1?

	//multiply by transpose
	double kx2=kx; double ky2=ky; double kz2=kz;
	kx=m_data[0][0]*kx2+m_data[1][0]*ky2+m_data[2][0]*kz2;
	ky=m_data[0][1]*kx2+m_data[1][1]*ky2+m_data[2][1]*kz2;
	kz=m_data[0][2]*kx2+m_data[1][2]*ky2+m_data[2][2]*kz2;
}
예제 #5
0
파일: coord.c 프로젝트: uak3103/voik
// обращение матрицы 3*3
MATR33 ObrMatr(const MATR33 &m)
{ MATR33 mo; double det=det33(m);
  mo.m11= (m.m22*m.m33-m.m23*m.m32)/det;
  mo.m12=-(m.m21*m.m33-m.m23*m.m31)/det;
  mo.m13= (m.m21*m.m32-m.m22*m.m31)/det;
  mo.m21=-(m.m12*m.m33-m.m13*m.m32)/det;
  mo.m22= (m.m11*m.m33-m.m13*m.m31)/det;
  mo.m23=-(m.m11*m.m32-m.m12*m.m31)/det;
  mo.m31= (m.m12*m.m23-m.m13*m.m22)/det;
  mo.m32=-(m.m11*m.m23-m.m13*m.m21)/det;
  mo.m33= (m.m11*m.m22-m.m12*m.m21)/det;
 return mo;
}
void VSObjectTransformation::invert() {
	double44 result;
	set_identity(result);
	double d33=det33(m_data);
	result[0][0]=(m_data[1][1]*m_data[2][2]-m_data[2][1]*m_data[1][2])*(+1)/d33;
	result[1][0]=(m_data[1][0]*m_data[2][2]-m_data[2][0]*m_data[1][2])*(-1)/d33;
	result[2][0]=(m_data[1][0]*m_data[2][1]-m_data[2][0]*m_data[1][1])*(+1)/d33;
	result[0][1]=(m_data[0][1]*m_data[2][2]-m_data[2][1]*m_data[0][2])*(-1)/d33;
	result[1][1]=(m_data[0][0]*m_data[2][2]-m_data[2][0]*m_data[0][2])*(+1)/d33;
	result[2][1]=(m_data[0][0]*m_data[2][1]-m_data[2][0]*m_data[0][1])*(-1)/d33;
	result[0][2]=(m_data[0][1]*m_data[1][2]-m_data[1][1]*m_data[0][2])*(+1)/d33;
	result[1][2]=(m_data[0][0]*m_data[1][2]-m_data[1][0]*m_data[0][2])*(-1)/d33;
	result[2][2]=(m_data[0][0]*m_data[1][1]-m_data[1][0]*m_data[0][1])*(+1)/d33;
	
	result[0][3]=-result[0][0]*m_data[0][3]-result[0][1]*m_data[1][3]-result[0][2]*m_data[2][3];
	result[1][3]=-result[1][0]*m_data[0][3]-result[1][1]*m_data[1][3]-result[1][2]*m_data[2][3];
	result[2][3]=-result[2][0]*m_data[0][3]-result[2][1]*m_data[1][3]-result[2][2]*m_data[2][3];
	
	set_data(result);
}