Определить точки, выше прямой

Помогите решить задачу нахождения координат точек(ближайшей, находящейся выше прямой, и ближайшей, находящейся нижу прямой) на плоскости. Сложность у меня заключается в определении точек выше\ниже прямой, так как из данных доступны только координаты самих точек, их кол-во и две точки для составления уравнения прямой. Как определить расстояние до прямой я допер, а вот как определить, какие из введенных точек выше или ниже хз (точнее как это реализовать программно, т.к. для определения выше или ниже достаточно сравнить координаты y точки и прямой)
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main(void)
{
float a,b,c,t,d;
int x1,x2,x3,y1,y2,y3;
printf("introduce the coordinates of first point(x,y)\n");
scanf("%d %d",&x1,&y1);
printf("introduce the coordinates of second point(x,y)\n");
scanf("%d %d",&x2,&y2);
printf("enter the coordinates of a point(x,y)\n");
scanf("%d %d",&x3,&y3);
a=y2-y1;
b=x1-x2;
c=-x1*(y2-y1)+y1*(x2-x1);
t=sqrt(a*a+b*b);
d=abs((a*x3+b*y3+c)/t);
printf("free term is equal to %f\n",c);
printf("distance from a point to direct %f cm\n",d);
getch();
}
7 ответов

lolwner, Прямая разбивает плоскость на 2 полуплоскости. Если подставить координаты точки (x0, y0) в уравнение прямой ax + by + c = 0, то в зависимости от знака неравенства, (ax0 + by0 + c > 0 или < 0) можно выяснить, в какой полуплоскости относительно данной прямой лежит точка.


Спасибо огромное!


Короче вопрос немного не по теме. В задаче нужно рассмотреть три случая: когда точка лежит вне треугольника, когда точка лежит на одной из сторон и когда точка лежит внутри треугольника. Как определить, лежит точка на одной из сторон или нет?


небольшой апдейт - тестирую кусок проверки введенных точек (пока что сравниваю y не с прямой, а с 2, просто посмотреть, работает или нет) и вот беда, в конце в цикле for зацикливание, не пойму, что же там неправильного, помогите разобраться, буду признателен!
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
 
 
int n;//размер массива
int f;//присваивание координат
float A;
float *a; //массив
int i;//текущий элемент
float *b;//массив
float *c;//массив
int k;
int j;
 
int main()
{
 printf("Enter number of points\n");
 do
 {
  printf("n=");
  f = scanf_s("%d", &n);
  n = n*2;
  fflush(stdin);
  if (f == 0 || n <= 0)
   printf("Incorrect data\n");
 } while (f == 0 || n <= 0);
 
 printf("enter A[N]\n");
 a = (float*)malloc(sizeof(float)*n);
 b = (float*)malloc(sizeof(float)*n);
 c = (float*)malloc(sizeof(float)*n);
 
 do
 {
  for (i = 0; i<n; i++)
  {
      if((i+1) % 2){
   printf("A[x]=");
      }
      else{
          printf("A[y]=");
      }
   f = scanf_s("%f", (a+i));
   fflush(stdin);
   
   if (f == 0)
   {
    printf("Incorrect data\n");
    i--;
   }
   
  }
 } while (f == 0);
 
 
  
 
 for (i = 0; i<n; i++)
  printf_s("   A[%d]=%f\n", i + 1, *(a + i));
 
//вверху все робит
 printf("Dinamo pamat`\n");
 
  for(i=1;i<=n;(i+2)){
      printf("Proverka y\n");
      if(i > 2){
          printf("y >2\n");
          b[i] = a[i];
      } else {
          printf("y < 2\n");
          c[i] = a[i];
      }
  }
 system("pause");
 return 0;
}


небольшой апдейт - тестирую кусок проверки введенных точек (пока что сравниваю y не с прямой, а с 2, просто посмотреть, работает или нет) и вот беда, в конце в цикле for зацикливание, не пойму, что же там неправильного, помогите разобраться, буду признателен!
может проблема в for(i=1;i<=n;(i+2))? попробуйте заменить на for(i=1;i<=n; i+=2)


Спасибо, помогло!Теперь еще одна проблема, может из-за неправильной передачи значений, или из-за типов, но в самом конце кода неправильно рассчитывает дистанцию (вместо числа выдает кодировку -1.#INDOO). Помогите разобраться.
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
 
 
int n;//размер массива
int f;//присваивание координат
float A;
float *a; //массив
int i;//текущий элемент
float *b;//массив
float *c;//массив
int k;
int j;
float px1, px2, py1, py2;
float Line1, Line2;
float freeterm;
float t;
float d;
 
int main()
{
 printf("Enter number of points\n");
 do
 {
  printf("n=");
  f = scanf_s("%d", &n);
  n = n*2;
  fflush(stdin);
  if (f == 0 || n <= 0)
   printf("Incorrect data\n");
 } while (f == 0 || n <= 0);
 
 printf("enter A[N]\n");
 a = (float*)malloc(sizeof(float)*n);
 b = (float*)malloc(sizeof(float)*n);
 c = (float*)malloc(sizeof(float)*n);
 
 do
 {
  for (i = 0; i<n; i++)
  {
      if((i+1) % 2){
   printf("A[x]=");
      }
      else{
          printf("A[y]=");
      }
   f = scanf_s("%f", (a+i));
   fflush(stdin);
   
   if (f == 0)
   {
    printf("Incorrect data\n");
    i--;
   }
   
  }
 } while (f == 0);
 
 for (i = 0; i<n; i++)
  printf_s("   A[%d]=%f\n", i + 1, *(a + i));
 
//вверху все робит
 printf("Dinamo pamat`\n");
 
  for(i=1;i<=n;i+=2){
      printf("Proverka y\n");
      if(i > 2){
          printf("y >2\n");
          b[i] = a[i];
      } else {
          printf("y < 2\n");
          c[i] = a[i];
      }
  }
 
printf("introduce the coordinates of first point(x,y)\n");
scanf("%d %d",&px1,&py1);
printf("introduce the coordinates of second point(x,y)\n");
scanf("%d %d",&px2,&py2);
Line1=py2-py1;
Line2=px1-px2;
freeterm = -px1*(py2-py1)+py1*(px2-px1);
t=sqrt(Line1*Line1+Line2*Line2);
d=abs((Line1*a[0]+Line2*a[1]+freeterm)/t);
printf("free term is equal to %f\n",c);
printf("distance from a point to direct %f cm\n",d);
 
 
 
 
 system("pause");
 return 0;
}


Помогите разобраться.
см комментарии:
printf("introduce the coordinates of first point(x,y)\n");
scanf("%d %d",&px1,&py1);// здесь и ниже спецификатор должен быть не %d , а %f
printf("introduce the coordinates of second point(x,y)\n");
scanf("%d %d",&px2,&py2);