Beispiel #1
0
/* =============================================================================
 * 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);
}
Beispiel #2
0
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]);
}
Beispiel #3
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);
}