- Vector span = crod.position+i->type->connect_offset-i->position;
- float cd = i->type->connect_point.norm();
- Angle ca = Geometry::atan2(i->type->connect_point.z, i->type->connect_point.x);
- span.x = sqrt(cd*cd-span.z*span.z)*(span.x>0 ? 1 : -1);
- i->angle = Geometry::atan2(span.z, span.x)-ca;
- crod.position.x = i->position.x+span.x-i->type->connect_offset.x;
- }
- else if(i->type->limit==VehicleType::Rod::ROTATE && crod.type->limit==VehicleType::Rod::ROTATE)
- {
- Vector span = crod.position-i->position;
- float d = span.norm();
- float cd1 = i->type->connect_point.norm();
- float cd2 = i->type->connect_offset.norm();
- float a = (d*d+cd1*cd1-cd2*cd2)/(2*d);
- float b = sqrt(cd1*cd1-a*a);
- float sign = (cross(i->type->connect_point, span).y>0 ? 1 : -1);
- Vector conn = Vector(span.x*a-span.z*b, 0, span.z*a+span.x*b)/(d*sign);
- Angle ca1 = Geometry::atan2(i->type->connect_point.z, i->type->connect_point.x);
- Angle ca2 = Geometry::atan2(i->type->connect_offset.z, i->type->connect_offset.x);
- i->angle = Geometry::atan2(conn.z, conn.x)-ca1;
- crod.angle = Geometry::atan2(conn.z-span.z, conn.x-span.x)-ca2;