void GeometryFeatureExtractor::computeFeatures(const ContinuationSegment& continuation, std::vector<double>& features) { const util::point<double>& sourceCenter = continuation.getSourceSlice()->getComponent()->getCenter(); const util::point<double>& targetCenter = continuation.getTargetSlice()->getComponent()->getCenter(); unsigned int sourceSize = continuation.getSourceSlice()->getComponent()->getSize(); unsigned int targetSize = continuation.getTargetSlice()->getComponent()->getSize(); util::point<double> difference = sourceCenter - targetCenter; double distance = difference.x*difference.x + difference.y*difference.y; double setDifference = _setDifference(*continuation.getSourceSlice(), *continuation.getTargetSlice(), false, false); double setDifferenceRatio = setDifference/(sourceSize + targetSize); double alignedSetDifference = _setDifference(*continuation.getSourceSlice(), *continuation.getTargetSlice(), false, true); double alignedSetDifferenceRatio = setDifference/(sourceSize + targetSize); double overlap = _overlap(*continuation.getSourceSlice(), *continuation.getTargetSlice()); double overlapRatio = overlap/(sourceSize + targetSize - overlap); double alignedOverlap = _alignedOverlap(*continuation.getSourceSlice(), *continuation.getTargetSlice()); double alignedOverlapRatio = alignedOverlap/(sourceSize + targetSize - overlap); features[0] = distance; features[1] = setDifference; features[2] = setDifferenceRatio; features[3] = alignedSetDifference; features[4] = alignedSetDifferenceRatio; features[5] = (continuation.getSourceSlice()->getComponent()->getSize() + continuation.getTargetSlice()->getComponent()->getSize())*0.5; features[6] = overlap; features[7] = overlapRatio; features[8] = alignedOverlap; features[9] = alignedOverlapRatio; if (!_noSliceDistance) { double averageSliceDistance, maxSliceDistance; _distance(*continuation.getSourceSlice(), *continuation.getTargetSlice(), true, false, averageSliceDistance, maxSliceDistance); double alignedAverageSliceDistance, alignedMaxSliceDistance; _distance(*continuation.getSourceSlice(), *continuation.getTargetSlice(), true, true, alignedAverageSliceDistance, alignedMaxSliceDistance); features[10] = averageSliceDistance; features[11] = maxSliceDistance; features[12] = alignedAverageSliceDistance; features[13] = alignedMaxSliceDistance; } }
__forceinline int ClusteredLightCuller::_sphereOverlapsFroxel(int x, int y, int z, float sphere_radius, const vec3& sphere_center, const FroxelInfo* froxel_infos) { __m128* center_coord = (__m128*)&froxel_infos[_toFlatFroxelIndex(x, y, z)].center_coord; __m128 sse_sphere_center = _mm_set_ps(1.0, sphere_center.z, sphere_center.y, sphere_center.x); __m128 sse_plane_normal = _normalize(_mm_sub_ps(*center_coord, sse_sphere_center)); __m128 plane_origin = _mm_add_ps(sse_sphere_center, _mm_mul_ps(_mm_set1_ps(sphere_radius), sse_plane_normal)); __m128 sse_dot_plane = _mm_dp_ps(plane_origin, sse_plane_normal, 0x70 | 0xF); __m128* corner_a = (__m128*)&froxel_infos[_toFlatFroxelIndex(x + 0, y + 0, z + 0)].corner_coord; __m128* corner_b = (__m128*)&froxel_infos[_toFlatFroxelIndex(x + 1, y + 0, z + 0)].corner_coord; __m128* corner_c = (__m128*)&froxel_infos[_toFlatFroxelIndex(x + 1, y + 1, z + 0)].corner_coord; __m128* corner_d = (__m128*)&froxel_infos[_toFlatFroxelIndex(x + 0, y + 1, z + 0)].corner_coord; if (_overlap(sse_plane_normal, sse_dot_plane, corner_a, corner_b, corner_c, corner_d)) return 1; corner_a = (__m128*)&froxel_infos[_toFlatFroxelIndex(x + 0, y + 0, z + 1)].corner_coord; corner_b = (__m128*)&froxel_infos[_toFlatFroxelIndex(x + 1, y + 0, z + 1)].corner_coord; corner_c = (__m128*)& froxel_infos[_toFlatFroxelIndex(x + 1, y + 1, z + 1)].corner_coord; corner_d = (__m128*)& froxel_infos[_toFlatFroxelIndex(x + 0, y + 1, z + 1)].corner_coord; return (_overlap(sse_plane_normal, sse_dot_plane, corner_a, corner_b, corner_c, corner_d)); }
vector<Interval> merge(vector<Interval> &intervals) { vector <Interval> ret; sort(begin(intervals), end(intervals), [](const Interval &a, const Interval &b) { if (a.start != b.start) return a.start < b.start; return a.end < b.end; }); for (auto &i: intervals) { if (ret.empty()) { ret.push_back(i); } else { if (!_overlap(ret.back(), i)) ret.push_back(i); } } return ret; }
void GeometryFeatureExtractor::computeFeatures(const BranchSegment& branch, std::vector<double>& features) { const util::point<double>& sourceCenter = branch.getSourceSlice()->getComponent()->getCenter(); const util::point<double>& targetCenter1 = branch.getTargetSlice1()->getComponent()->getCenter(); const util::point<double>& targetCenter2 = branch.getTargetSlice2()->getComponent()->getCenter(); unsigned int sourceSize = branch.getSourceSlice()->getComponent()->getSize(); unsigned int targetSize1 = branch.getTargetSlice1()->getComponent()->getSize(); unsigned int targetSize2 = branch.getTargetSlice2()->getComponent()->getSize(); util::point<double> difference = sourceCenter - (targetCenter1*targetSize1 + targetCenter2*targetSize2)/((double)(targetSize1 + targetSize2)); double distance = difference.x*difference.x + difference.y*difference.y; double setDifference = _setDifference(*branch.getTargetSlice1(), *branch.getTargetSlice2(), *branch.getSourceSlice(), false, false); double setDifferenceRatio = setDifference/(sourceSize + targetSize1 + targetSize2); double alignedSetDifference = _setDifference(*branch.getTargetSlice1(), *branch.getTargetSlice2(), *branch.getSourceSlice(), false, true); double alignedSetDifferenceRatio = alignedSetDifference/(sourceSize + targetSize1 + targetSize2); double overlap = _overlap(*branch.getTargetSlice1(), *branch.getTargetSlice2(), *branch.getSourceSlice()); double overlapRatio = overlap/(sourceSize + targetSize1 + targetSize2 - overlap); double alignedOverlap = _alignedOverlap(*branch.getTargetSlice1(), *branch.getTargetSlice2(), *branch.getSourceSlice()); double alignedOverlapRatio = alignedOverlap/(sourceSize + targetSize1 + targetSize2 - alignedOverlap); features[0] = distance; features[1] = setDifference; features[2] = setDifferenceRatio; features[3] = alignedSetDifference; features[4] = alignedSetDifferenceRatio; features[5] = (branch.getSourceSlice()->getComponent()->getSize() + branch.getTargetSlice1()->getComponent()->getSize() + branch.getTargetSlice2()->getComponent()->getSize())/3.0; features[6] = overlap; features[7] = overlapRatio; features[8] = alignedOverlap; features[9] = alignedOverlapRatio; if (!_noSliceDistance) { double averageSliceDistance, maxSliceDistance; _distance(*branch.getTargetSlice1(), *branch.getTargetSlice2(), *branch.getSourceSlice(), true, false, averageSliceDistance, maxSliceDistance); double alignedAverageSliceDistance, alignedMaxSliceDistance; _distance(*branch.getTargetSlice1(), *branch.getTargetSlice2(), *branch.getSourceSlice(), true, true, alignedAverageSliceDistance, alignedMaxSliceDistance); features[10] = averageSliceDistance; features[11] = maxSliceDistance; features[12] = alignedAverageSliceDistance; features[13] = alignedMaxSliceDistance; } }