# Points of intertersection for circumfernce measurement on human body and use of convex hull

Hello, I’m new to Three.js, and I am using React Three Fiber for my project. My main task is to implement a plane intersection with a mesh algorithm and compute the convex hull of the intersection points for circumference measurement on the human body. I am working on it but got stuck. Can you help me figure out what I am doing wrong? I want to only get points that intersect the plane in a convex shape.

``````const setPointOfIntersection=(line, plane, pointsOfIntersection)=> {
const pointOfIntersection = plane?.intersectLine(line, new Vector3());
if (pointOfIntersection) {
pointsOfIntersection.push(pointOfIntersection);
};
}

function calculateIntersections(plane, mesh) {
var a = new Vector3(),
b = new Vector3(),
c = new Vector3();
var planePointA = new Vector3(),
planePointB = new Vector3(),
planePointC = new Vector3();
var lineAB = new Line3(),
lineBC = new Line3(),
lineCA = new Line3();

// var pointOfIntersection = new Vector3();

var mathPlane = new Plane();

const positionAttribute = plane.geometry.getAttribute('position');

const localVertex = new Vector3();

localVertex.fromBufferAttribute(positionAttribute, 0);
plane.localToWorld(planePointA?.copy(localVertex));
localVertex.fromBufferAttribute(positionAttribute, 1);
plane.localToWorld(planePointB?.copy(localVertex));
localVertex.fromBufferAttribute(positionAttribute, 2);
plane.localToWorld(planePointC?.copy(localVertex));

mathPlane.setFromCoplanarPoints(planePointA, planePointB, planePointC);

var pointsOfIntersection = [];

const dodecaPositionAttribute = mesh.geometry.getAttribute('position');
for (let vertexIndex = 0; vertexIndex < dodecaPositionAttribute.count; vertexIndex += 3) {

localVertex.fromBufferAttribute(dodecaPositionAttribute, vertexIndex);
mesh.localToWorld(a?.copy(localVertex));
localVertex.fromBufferAttribute(dodecaPositionAttribute, vertexIndex + 1);
mesh.localToWorld(b?.copy(localVertex));
localVertex.fromBufferAttribute(dodecaPositionAttribute, vertexIndex) + 2
mesh.localToWorld(c?.copy(localVertex));

lineAB = new Line3(a, b);
lineBC = new Line3(b, c);
lineCA = new Line3(c, a);

setPointOfIntersection(lineAB, mathPlane, pointsOfIntersection);
setPointOfIntersection(lineBC, mathPlane, pointsOfIntersection);
setPointOfIntersection(lineCA, mathPlane, pointsOfIntersection);
}
return pointsOfIntersection;
// return positions;
//   pointsOfIntersection.setAttribute(
//     'position',
//     new BufferAttribute(new Float32Array(positions), 3));

// var pointsMaterial = new PointsMaterial({
//     size: 0.01,
//     color: "red"
// });

// var points = new Points(pointsOfIntersection, pointsMaterial);

}

const addPlaneToMesh = () => {
if (!obj) return;

const mesh = obj.children[0];

if (mesh.isMesh) {
//const randomIndex = 1327
const plane = new Mesh(new PlaneGeometry(1, 1), new MeshBasicMaterial({ color: "lightgray", transparent: true, opacity: 0.425, side: DoubleSide }));
plane.rotateX(-Math.PI / 2);

const intersectionPoints = calculateIntersections(plane, mesh);
// console.log("intersectionPoints",intersectionPoints);
const convexHullPoints = computeConvexHull(intersectionPoints);

const pointsGeometry = new BufferGeometry().setFromPoints(intersectionPoints);
let pointsMaterial = new PointsMaterial({
size: .1,
color: "red"
});
let points = new Points(pointsGeometry, pointsMaterial);

}
}
function computeConvexHull(points) {
const geometry = new ConvexGeometry(points);
const positions = geometry.attributes.position.array;
const vertices = [];

for (let i = 0; i < geometry.attributes.position.count; i += 3) {
vertices.push(new Vector3(positions[i], positions[i + 1], positions[i + 2]));
}

return vertices;
}
``````

@Mugen87 @prisoner849 Can you help me with my problem? That would be appreciated.

I didn’t get this phrase. A convex hull of a set of coplanar points is a flat figure

@prisoner849 Thanks for your answer. The code is copied from one of the answers on Three.js, and I don’t know much about `setcoplaner` . Can you guide me? I just want to get all points that intersect with the plane. That is currently my objective. I am using the `positions` attribute for that. Let me share an image of what these will be used for. I want to calculate the distance between these points for circumference measurement.

You can start with this: Three-mesh-bvh: A plugin for fast geometry raycasting and spatial queries! - #18 by gkjohnson
@gkjohnson’s solution is way faster than the original mine.

1 Like