当前位置: 首页>>代码示例>>C++>>正文


C++ dgVector::DotProduct4方法代码示例

本文整理汇总了C++中dgVector::DotProduct4方法的典型用法代码示例。如果您正苦于以下问题:C++ dgVector::DotProduct4方法的具体用法?C++ dgVector::DotProduct4怎么用?C++ dgVector::DotProduct4使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在dgVector的用法示例。


在下文中一共展示了dgVector::DotProduct4方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: SupportVertexSpecial

dgVector dgCollisionCone::SupportVertexSpecial(const dgVector& dir, dgInt32* const vertexIndex) const
{
	dgAssert(dgAbsf((dir % dir - dgFloat32(1.0f))) < dgFloat32(1.0e-3f));

	if (dir.m_x < dgFloat32(-0.9999f)) {
		return dgVector(-(m_height - D_CONE_SKIN_THINCKNESS), dgFloat32(0.0f), dgFloat32(0.0f), dgFloat32(0.0f));
	} else if (dir.m_x > dgFloat32(0.9999f)) {
		return dgVector(m_height - D_CONE_SKIN_THINCKNESS, dgFloat32(0.0f), dgFloat32(0.0f), dgFloat32(0.0f));
	} else {
		dgVector dir_yz(dir);
		dir_yz.m_x = dgFloat32(0.0f);
		dgFloat32 mag2 = dir_yz.DotProduct4(dir_yz).GetScalar();
		dgAssert(mag2 > dgFloat32(0.0f));
		dir_yz = dir_yz.Scale4(dgFloat32(1.0f) / dgSqrt(mag2));

		dgVector p0(dir_yz.Scale4(m_radius - D_CONE_SKIN_THINCKNESS));
		dgVector p1(dgVector::m_zero);

		p0.m_x = -(m_height - D_CONE_SKIN_THINCKNESS);
		p1.m_x =   m_height - D_CONE_SKIN_THINCKNESS;

		dgFloat32 dist0 = dir.DotProduct4(p0).GetScalar();
		dgFloat32 dist1 = dir.DotProduct4(p1).GetScalar();

		if (dist1 >= dist0) {
			p0 = p1;
		}
		return p0;
	}
}
开发者ID:Hurleyworks,项目名称:MiniNewton,代码行数:30,代码来源:dgCollisionCone.cpp

示例2: SupportVertex

dgVector dgCollisionCylinder::SupportVertex (const dgVector& dir, dgInt32* const vertexIndex) const
{
	dgAssert (dgAbsf ((dir % dir - dgFloat32 (1.0f))) < dgFloat32 (1.0e-3f));

	if (dir.m_x < dgFloat32(-0.9999f)) {
		return dgVector(-m_height, dgFloat32(0.0f), dgFloat32(0.0f), dgFloat32(0.0f));
	} else if (dir.m_x > dgFloat32(0.9999f)) {
		return dgVector(m_height, dgFloat32(0.0f), dgFloat32(0.0f), dgFloat32(0.0f));
	} else {
		dgVector dir_yz (dir);
		dir_yz.m_x = dgFloat32 (0.0f);
		dgFloat32 mag2 = dir_yz.DotProduct4(dir_yz).GetScalar();
		dgAssert (mag2 > dgFloat32 (0.0f));
		dir_yz = dir_yz.Scale4 (dgFloat32 (1.0f) / dgSqrt (mag2));
		dgVector p0 (dir_yz.Scale4 (m_radio0));
		dgVector p1 (dir_yz.Scale4 (m_radio1));

		p0.m_x = -m_height;
		p1.m_x =  m_height;

		dgFloat32 dist0 = dir.DotProduct4(p0).GetScalar();
		dgFloat32 dist1 = dir.DotProduct4(p1).GetScalar();

		if (dist1 >= dist0) {
			p0 = p1;
		}
		return p0;
	}
}
开发者ID:Hurleyworks,项目名称:MiniNewton,代码行数:29,代码来源:dgCollisionCylinder.cpp

示例3: CalculateContacts

dgInt32 dgCollisionChamferCylinder::CalculateContacts (const dgVector& point, const dgVector& normal, dgCollisionParamProxy& proxy, dgVector* const contactsOut) const
{
	dgFloat32 disc2 = point.m_y * point.m_y + point.m_z * point.m_z;
	if (disc2 < m_radius * m_radius) {
		dgVector cylinderNormal ((point.m_x >= dgFloat32 (0.0)) ? dgFloat32 (-1.0f) : dgFloat32 (1.0f), dgFloat32 (0.0f), dgFloat32 (0.0f), dgFloat32 (0.0f));
		return CalculateContactsGeneric (point, cylinderNormal, proxy, contactsOut);
	} else {

		dgVector r (dgFloat32 (0.0f), point.m_y, point.m_z, dgFloat32 (0.0f));
		dgAssert ((r % r) > dgFloat32 (0.0f));
//		r = r.Scale3(m_radius * dgRsqrt (r % r));
		r = r.CompProduct4(r.InvMagSqrt()).Scale4(m_radius);
		//dgFloat32 t = normal % (r - point);
		dgVector t (normal.DotProduct4(r - point));
		//contactsOut[0] = r - normal.Scale3 (t);
		contactsOut[0] = r - normal.CompProduct4(t);
		return 1;
	}
}
开发者ID:alexsaen,项目名称:newton-dynamics,代码行数:19,代码来源:dgCollisionChamferCylinder.cpp

示例4: BeamClipping

void dgCollisionConvexPolygon::BeamClipping (const dgVector& origin, dgFloat32 dist)
{
    dgPlane planes[4];
    dgVector points[sizeof (m_localPoly) / sizeof (m_localPoly[0]) + 8];
    dgClippedFaceEdge clippedFace [2 * sizeof (m_localPoly) / sizeof (m_localPoly[0]) + 8];

    dgVector dir (m_localPoly[1] - m_localPoly[0]);
    dgAssert (dir.m_w == dgFloat32 (0.0f));
    dgAssert ((dir % dir) > dgFloat32 (1.0e-8f));
    dir = dir.CompProduct4 (dir.InvMagSqrt());

    dgFloat32 distH = origin.DotProduct4(dir).GetScalar();
    planes[0] = dgPlane (dir, dist - distH);
    planes[2] = dgPlane (dir.CompProduct4 (dgVector::m_negOne), dist + distH);

    dir = m_normal * dir;
    dgFloat32 distV = origin.DotProduct4(dir).GetScalar();
    planes[1] = dgPlane (dir, dist - distV);
    planes[3] = dgPlane (dir.CompProduct4 (dgVector::m_negOne), dist + distV);

    for (dgInt32 i = 0; i < m_count; i ++) {
        dgInt32 j = i << 1;
        dgAssert (j < sizeof (clippedFace) / sizeof (clippedFace[0]));

        points[i] = m_localPoly[i];

        clippedFace[j + 0].m_twin = &clippedFace[j + 1];
        clippedFace[j + 0].m_next = &clippedFace[j + 2];
        clippedFace[j + 0].m_incidentVertex = i;
        clippedFace[j + 0].m_incidentNormal = m_adjacentFaceEdgeNormalIndex[i];

        clippedFace[j + 1].m_twin = &clippedFace[j + 0];
        clippedFace[j + 1].m_next = &clippedFace[j - 2];
        clippedFace[j + 1].m_incidentVertex = i + 1;
        clippedFace[j + 1].m_incidentNormal = -1;
    }

    clippedFace[1].m_next = &clippedFace[m_count * 2 - 2 + 1];
    dgAssert ((m_count * 2 - 2) >= 0);
    clippedFace[m_count * 2 - 2].m_next = &clippedFace[0];
    clippedFace[m_count * 2 - 2 + 1].m_incidentVertex = 0;

    dgInt32 edgeCount = m_count * 2;
    dgInt32 indexCount = m_count;
    dgClippedFaceEdge* first = &clippedFace[0];
    for (dgInt32 i = 0; i < 4; i ++) {
        const dgPlane& plane = planes[i];

        dgInt32 conectCount = 0;
        dgClippedFaceEdge* connect[2];
        dgClippedFaceEdge* ptr = first;
        dgClippedFaceEdge* newFirst = first;
        dgFloat32 test0 = plane.Evalue(points[ptr->m_incidentVertex]);
        do {
            dgFloat32 test1 = plane.Evalue(points[ptr->m_next->m_incidentVertex]);

            if (test0 > dgFloat32 (1.0e-2f)) {
                if (test1 <= dgFloat32 (-1.0e-2f)) {
                    const dgVector& p0 = points[ptr->m_incidentVertex];
                    const dgVector& p1 = points[ptr->m_next->m_incidentVertex];
                    dgVector dp (p1 - p0);
                    points[indexCount] = p0 - dp.Scale4 (test0 / dp.DotProduct4(plane).GetScalar());

                    dgClippedFaceEdge* const newEdge = &clippedFace[edgeCount];
                    newEdge->m_twin = newEdge + 1;
                    newEdge->m_twin->m_twin = newEdge;

                    newEdge->m_twin->m_incidentNormal = ptr->m_incidentNormal;
                    newEdge->m_incidentNormal = ptr->m_incidentNormal;

                    newEdge->m_incidentVertex = indexCount;
                    newEdge->m_twin->m_incidentVertex = ptr->m_next->m_incidentVertex;
                    ptr->m_twin->m_incidentVertex = indexCount;

                    newEdge->m_next = ptr->m_next;
                    ptr->m_next->m_twin->m_next = newEdge->m_twin;
                    newEdge->m_twin->m_next = ptr->m_twin;
                    ptr->m_next = newEdge;

                    connect[conectCount] = ptr;
                    conectCount ++;
                    indexCount ++;
                    edgeCount += 2;
                    ptr = newEdge;
                }
            } else {
                if (test1 > dgFloat32 (1.0e-2f)) {
                    newFirst = ptr->m_next;

                    const dgVector& p0 = points[ptr->m_incidentVertex];
                    const dgVector& p1 = points[ptr->m_next->m_incidentVertex];
                    dgVector dp (p1 - p0);
                    points[indexCount] = p0 - dp.Scale4 (test0 / dp.DotProduct4(plane).GetScalar());

                    dgClippedFaceEdge* const newEdge = &clippedFace[edgeCount];
                    newEdge->m_twin = newEdge + 1;
                    newEdge->m_twin->m_twin = newEdge;

                    newEdge->m_twin->m_incidentNormal = ptr->m_incidentNormal;;
                    newEdge->m_incidentNormal = ptr->m_incidentNormal;
//.........这里部分代码省略.........
开发者ID:Hurleyworks,项目名称:NewtonBlock,代码行数:101,代码来源:dgCollisionConvexPolygon.cpp

示例5: CalculatePlaneIntersection

dgInt32 dgCollisionBox::CalculatePlaneIntersection (const dgVector& normal, const dgVector& point, dgVector* const contactsOut) const
{
	dgVector support[4];
	dgInt32 featureCount = 3;
	
	const dgConvexSimplexEdge** const vertToEdgeMapping = GetVertexToEdgeMapping();
	if (vertToEdgeMapping) {
		dgInt32 edgeIndex;
		//support[0] = SupportVertex (normal.Scale4(normalSign), &edgeIndex);
		support[0] = SupportVertex (normal, &edgeIndex);

		dgFloat32 dist = normal.DotProduct4(support[0] - point).GetScalar();
		if (dist <= DG_IMPULSIVE_CONTACT_PENETRATION) {
			dgVector normalAlgin (normal.Abs());
			if (!((normalAlgin.m_x > dgFloat32 (0.9999f)) || (normalAlgin.m_y > dgFloat32 (0.9999f)) || (normalAlgin.m_z > dgFloat32 (0.9999f)))) {
				// 0.25 degrees
				const dgFloat32 tiltAngle = dgFloat32 (0.005f);
				const dgFloat32 tiltAngle2 = tiltAngle * tiltAngle ;
				dgPlane testPlane (normal, - (normal.DotProduct4(support[0]).GetScalar()));

				featureCount = 1;
				const dgConvexSimplexEdge* const edge = vertToEdgeMapping[edgeIndex];
				const dgConvexSimplexEdge* ptr = edge;
				do {
					const dgVector& p = m_vertex[ptr->m_twin->m_vertex];
					dgFloat32 test1 = testPlane.Evalue(p);
					dgVector dist (p - support[0]);
					dgFloat32 angle2 = test1 * test1 / (dist.DotProduct4(dist).GetScalar());
					if (angle2 < tiltAngle2) {
						support[featureCount] = p;
						featureCount ++;
					}
					ptr = ptr->m_twin->m_next;
				} while ((ptr != edge) && (featureCount < 3));
			}
		}
	}

	dgInt32 count = 0;
	switch (featureCount)
	{
		case 1:
		{
			contactsOut[0] = support[0] - normal.CompProduct4(normal.DotProduct4(support[0] - point));
			count = 1;
			break;
		}

		case 2:
		{
			contactsOut[0] = support[0] - normal.CompProduct4(normal.DotProduct4(support[0] - point));
			contactsOut[1] = support[1] - normal.CompProduct4(normal.DotProduct4(support[1] - point));
			count = 2;
			break;
		}

		default:
		{
			dgFloat32 test[8];
			dgAssert(normal.m_w == dgFloat32(0.0f));
			dgPlane plane(normal, -(normal.DotProduct4(point).GetScalar()));
			for (dgInt32 i = 0; i < 8; i++) {
				dgAssert(m_vertex[i].m_w == dgFloat32(0.0f));
				test[i] = plane.DotProduct4(m_vertex[i] | dgVector::m_wOne).m_x;
			}

			dgConvexSimplexEdge* edge = NULL;
			for (dgInt32 i = 0; i < dgInt32 (sizeof (m_edgeEdgeMap) / sizeof (m_edgeEdgeMap[0])); i ++) {
				dgConvexSimplexEdge* const ptr = m_edgeEdgeMap[i];
				dgFloat32 side0 = test[ptr->m_vertex];
				dgFloat32 side1 = test[ptr->m_twin->m_vertex];
				if ((side0 * side1) < dgFloat32 (0.0f)) {
					edge = ptr;
					break;
				}
			}

			if (edge) {
				if (test[edge->m_vertex] < dgFloat32 (0.0f)) {
					edge = edge->m_twin;
				}
				dgAssert (test[edge->m_vertex] > dgFloat32 (0.0f));

				dgConvexSimplexEdge* ptr = edge;
				dgConvexSimplexEdge* firstEdge = NULL;
				dgFloat32 side0 = test[edge->m_vertex];
				do {
					dgAssert (m_vertex[ptr->m_twin->m_vertex].m_w == dgFloat32 (0.0f));
					dgFloat32 side1 = test[ptr->m_twin->m_vertex];
					if (side1 < side0) {
						if (side1 < dgFloat32 (0.0f)) {
							firstEdge = ptr;
							break;
						}

						side0 = side1;
						edge = ptr->m_twin;
						ptr = edge;
					}
					ptr = ptr->m_twin->m_next;
//.........这里部分代码省略.........
开发者ID:LaKraven,项目名称:newton-dynamics,代码行数:101,代码来源:dgCollisionBox.cpp


注:本文中的dgVector::DotProduct4方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。