построить многоугольник отодвинув его стороны

Задача: Множество точек определяет многоугольник. Построить многоугольник, который получится, если линию, задающую каждую сторону, отодвинуть в перпендикулярном ей направлении на величину h.

Написал какой-то код, который в какой то момент крашиться (возвращает мусор). Помогите найти ошибку, пожалуйста!

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define bool unsigned short
#define false 0
#define true 1
#define Pi 3.1415926

typedef struct
{
    double X, Y;
} Point;

void ReadArray(FILE* in, Point* arr, int* n);
void PrintArray(Point* arr, int N);
void MoveArray(Point* P, int N, double h);

void ReadArray(FILE* in, Point* arr, int* n) //Прототип исправлен, чтобы значение N изменялось
{
    int i;
    for (i = 0; i < n; i++)
        fscanf(in, "%lf %lf", &arr[i].X, &arr[i].Y);
}

void PrintArray(Point* arr, int N)
{
    int i;
    for (i = 0; i < N; i++)
        printf("P%d = ( %7.2f ; %7.2f )\n", i + 1, arr[i].X, arr[i].Y);
}

void MoveArray(Point* P, int N, double h)
{
    int k1;
    //Получим результат сдвига в нужную сторону концов каждого отрезка
    //Проведем для каждой пары точек прямую
    //Используем форму "с угловыми коэффициентами" y = K*x+B
    double* K = (double*) malloc(sizeof(double) * N); //Угловые коэффициенты
    double* B = (double*) malloc(sizeof(double) * N); //Смещения

    //Сдвинуть точки и получить уравнения прямых
    for (k1 = 0; k1 < N; k1++)
    {
        int k2 = (k1 + 1) % N; //Индекс следующей точки
        Point P1, P2; //Начало и конец отрезка
        double dx = P[k2].X - P[k1].X;
        double dy = P[k2].Y - P[k1].Y;
        double Alpha = atan2(dy, dx); //Угол (от начала отрезка к его концу)
        Alpha += Pi / 2; //Перпендикуляр в нужном направлении
        dx = h * cos(Alpha); //Приращение
        dy = h * sin(Alpha);
        P1.X = P[k1].X + dx; //Новое положение точки
        P1.Y = P[k1].Y + dy;
        P2.X = P[k2].X + dx;
        P2.Y = P[k2].Y + dy;

        //Уравнение новой прямой
        dx = P2.X - P1.X; if (dx == 0) dx = 1e-6; //Не 0, чтобы не было переполнения
        dy = P2.Y - P1.Y;
        K[k1] = dy / dx;
        //Так как P1.Y = K[k]*P1.X + B[k], то
        B[k1] = K[k1] * P1.X - P1.Y;
    }

    //Для каждой пары прямых определить их точки пересечения.
    //Для точки P2(x2,y2) известно, что
    //y = k1*x+b1
    //y = k2*x+b2
    //откуда
    //k1*x+b1 = k2*x+b2
    //k1*x - k2*x = b2 - b1
    //x = (b2 - b1)/(k1-k2)
    //y = k1*x+b1
    for (k1 = 0; k1 < N; k1++)
    {
        int k2 = (k1 + 1) % N; //Индекс следующей точки
        double dk = K[k1] - K[k2];
        P[k1].X = (B[k2] - B[k1]) / dk;
        P[k1].Y = K[k1] * P[k1].X + B[k1];
    }
    //Это и есть новый многоугольник
    free(K); free(B);
}


int main(void)
{
    Point* P;
    FILE* f;
    int N;
    f = fopen("Square.txt", "r");
    fscanf(f, "%d", N);
    P = (Point*) malloc(N * sizeof(Point));
    int h = 1;
    ReadArray(f, P, N);
    fclose(f);
    printf("Source\n");
    PrintArray(P, N);
    MoveArray(P, N, h);
    printf("Modified\n");
    PrintArray(P, N);
    getchar();
}

Ответы (0 шт):