/* ============================================================================= * setEdge * * Note: Makes pairPtr sorted; i.e., coordinate_compare(first, second) < 0 * ============================================================================= */ static void setEdge (element_t* elementPtr, long i) { long numCoordinate = elementPtr->numCoordinate; coordinate_t* coordinates = elementPtr->coordinates; coordinate_t* firstPtr = &coordinates[i]; coordinate_t* secondPtr = &coordinates[(i + 1) % numCoordinate]; edge_t* edgePtr = &elementPtr->edges[i]; long cmp = coordinate_compare(firstPtr, secondPtr); assert(cmp != 0); if (cmp < 0) { edgePtr->firstPtr = (void*)firstPtr; edgePtr->secondPtr = (void*)secondPtr; } else { edgePtr->firstPtr = (void*)secondPtr; edgePtr->secondPtr = (void*)firstPtr; } coordinate_t* midpointPtr = &elementPtr->midpoints[i]; midpointPtr->x = (firstPtr->x + secondPtr->x) / 2.0; midpointPtr->y = (firstPtr->y + secondPtr->y) / 2.0; elementPtr->radii[i] = coordinate_distance(firstPtr, midpointPtr); }
static void calculateCircumCircle (element_t* elementPtr) { long numCoordinate = elementPtr->numCoordinate; coordinate_t* coordinates = elementPtr->coordinates; coordinate_t* circumCenterPtr = &elementPtr->circumCenter; ((void) (0)); if (numCoordinate == 2) { circumCenterPtr->x = (coordinates[0].x + coordinates[1].x) / 2.0; circumCenterPtr->y = (coordinates[0].y + coordinates[1].y) / 2.0; } else { double ax = coordinates[0].x; double ay = coordinates[0].y; double bx = coordinates[1].x; double by = coordinates[1].y; double cx = coordinates[2].x; double cy = coordinates[2].y; double bxDelta = bx - ax; double byDelta = by - ay; double cxDelta = cx - ax; double cyDelta = cy - ay; double bDistance2 = (bxDelta * bxDelta) + (byDelta * byDelta); double cDistance2 = (cxDelta * cxDelta) + (cyDelta * cyDelta); double xNumerator = (byDelta * cDistance2) - (cyDelta * bDistance2); double yNumerator = (bxDelta * cDistance2) - (cxDelta * bDistance2); double denominator = 2 * ((bxDelta * cyDelta) - (cxDelta * byDelta)); double rx = ax - (xNumerator / denominator); double ry = ay + (yNumerator / denominator); circumCenterPtr->x = rx; circumCenterPtr->y = ry; } elementPtr->circumRadius = coordinate_distance(circumCenterPtr, &coordinates[0]); }
/* ============================================================================= * element_isInCircumCircle * ============================================================================= */ bool element_isInCircumCircle (element_t* elementPtr, coordinate_t* coordinatePtr) { double distance = coordinate_distance(coordinatePtr, &elementPtr->circumCenter); return ((distance <= elementPtr->circumRadius) ? true : false); }