построить многоугольник отодвинув его стороны
Задача: Множество точек определяет многоугольник. Построить многоугольник, который получится, если линию, задающую каждую сторону, отодвинуть в перпендикулярном ей направлении на величину 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();
}