Форум программистов, компьютерный форум, киберфорум
Turbo Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 10.11.2011
Сообщений: 11
1

На плоскости имееться круг и n точек

10.11.2011, 11:13. Показов 492. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
У нас есть такая задача:
На плоскости имееться круг и n точек. Выбрать из них две такие, чтобы наименьшим образом различались количества точек в круге, лежащие по разные стороны прямой, проходящей через выбранные точки.
Плиз помогите
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2011, 11:13
Ответы с готовыми решениями:

На плоскости заданы множество точек М и круг
Здравствуйте.нужно написать программу используя процедуры и функции на Delphi.именно на делфи или...

На плоскости заданы множество точек М и круг
Здравствуйте.нужно написать программу используя процедуры и функции на Delphi.На плоскости заданы...

Количество целочисленных точек на плоскости, попадающих в круг радиуса R
R DB ? ; 0<R<150 Записать в регистр DX количество целочисленных точек на плоскости, попадающих...

Дано n точек на плоскости вывести точки,которые попали в заданный круг
#include <stdio.h> #include <stdlib.h> #include <math.h> int *a; struct Point { int x; ...

4
0 / 0 / 0
Регистрация: 10.11.2011
Сообщений: 11
13.11.2011, 00:42  [ТС] 2
Помогите плз оч срочно))
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
13.11.2011, 15:50 3
Как-то так.

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
uses crt;
const nmax=100;
type point=record
           x,y:real;
           end;
     mas=array[1..nmax] of point;
var c:point;{центр круга}
    t,t1:mas;{массивы точек}
    r,v:real;{радиус круга}
    n,m:byte;{размеры массивов}
    i,j,k:byte;{счетчики циклов}
    mn,imn,jmn,lv,pr:byte;{мин. разн., номера точек с мин. раз.
                           кол. слева и справа для минимальной разности}
    l1,p1:byte;{кол. слева и справа для всех прямых}
begin
clrscr;
{создание массива точек}
repeat
write('Количество точек до ',nmax,' n=');
readln(n);
until n in [1..nmax];
for i:=1 to n do
 begin
  t[i].x:=-9+random(19);
  t[i].y:=-9+random(19);
 end;
writeln('Исходный массив точек:');
for i:=1 to n do
write('(',t[i].x:5:2,';',t[i].y:5:2,')   ');
writeln;
writeln('Введите координаты центра круга и его радиус:');
readln(c.x,c.y,r);
{выбор точек, которые попадают в круг}
m:=0;
for i:=1 to n do
if sqr(t[i].x-c.x)+sqr(t[i].y-c.y)<=r*r then
 begin
  m:=m+1;
  t1[m]:=t[i];
 end;
if m=0 then
 begin
  write('Точек в круге нет, работа программы завершена');
  readln;
  exit;
 end;
writeln('Массив точек в круге:');
for i:=1 to m do
write('(',t1[i].x:5:2,';',t1[i].y:5:2,')   ');
writeln;
mn:=m;
imn:=1;
jmn:=2;
lv:=0;
pr:=0;
for i:=1 to n-1 do
for j:=i+1 to n do
 begin
  l1:=0;p1:=0;
  for k:=1 to m do
   begin
    {вектороное произведение [t[i],t[j]*[t[i],c]}
    v:=(t[j].x-t[i].x)*(t1[k].y-t[i].y)-(t[j].y-t[i].y)*(t1[k].x-t[i].x);
    if v>0 then inc(l1){если +, слева}
    else if v<0 then inc(p1);{если -, справа}
   end;
  if abs(l1-p1)<mn then
   begin
    mn:=abs(l1-p1);
    imn:=i;
    jmn:=j;
    lv:=l1;
    pr:=p1;
   end;
 end;
write('Прямая проходит через точки ');
write(imn,'(',t[imn].x:0:2,';',t[imn].y:0:2,') и ');
writeln(jmn,'(',t[jmn].x:0:2,';',t[jmn].y:0:2,')');
write('Точек слева=',lv,' справа=',pr);
readln
end.
Добавлено через 2 часа 37 минут
Для проверки можно добавить графику.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
uses crt,graph;
const nmax=100;
type point=record
           x,y:real;
           end;
     mas=array[1..nmax] of point;
var c:point;{центр круга}
    t,t1:mas;{массивы точек}
    r,v:real;{радиус круга}
    n,m:byte;{размеры массивов}
    i,j,k:byte;{счетчики циклов}
    mn,imn,jmn,lv,pr:byte;{мин. разн., номера точек с мин. раз.
                           кол. слева и справа для минимальной разности}
    l1,p1:integer;{кол. слева и справа для каждой прямой}
    xc,yc:integer;{начало координат и экранные координаты всех точек}
    min,max,ms:real;{минимум, максимум координат и масштаб для вывода на экран}
    x1,y1,x2,y2:integer;{экранные координаты точек}
    x,y,b,k1:real;{точки прямой и ее коэффициенты}
    s:string;
begin
clrscr;
{создание массива точек}
repeat
write('Количество точек до ',nmax,' n=');
readln(n);
until n in [1..nmax];
for i:=1 to n do
 begin
  t[i].x:=-9+random(19);
  t[i].y:=-9+random(19);
 end;
writeln('Исходный массив точек:');
for i:=1 to n do
write('(',t[i].x:5:2,';',t[i].y:5:2,')   ');
writeln;
writeln('Введите координаты центра круга и его радиус:');
readln(c.x,c.y,r);
{выбор точек, которые попадают в круг}
m:=0;
for i:=1 to n do
if sqr(t[i].x-c.x)+sqr(t[i].y-c.y)<=r*r then
 begin
  m:=m+1;
  t1[m]:=t[i];
 end;
if m=0 then
 begin
  write('Точек в круге нет, работа программы завершена');
  readln;
  exit;
 end;
writeln('Массив точек в круге:');
for i:=1 to m do
write('(',t1[i].x:5:2,';',t1[i].y:5:2,')   ');
writeln;
mn:=m;
imn:=1;
jmn:=2;
lv:=0;
pr:=0;
for i:=1 to n-1 do
for j:=i+1 to n do
 begin
  l1:=0;p1:=0;
  for k:=1 to m do
   begin
    v:=(t[j].x-t[i].x)*(t1[k].y-t[i].y)-(t[j].y-t[i].y)*(t1[k].x-t[i].x);
    if v>0 then inc(l1)
    else if v<0 then inc(p1);
   end;
  if abs(l1-p1)<mn then
   begin
    mn:=abs(l1-p1);
    imn:=i;
    jmn:=j;
    lv:=l1;
    pr:=p1;
   end;
 end;
write('Прямая проходит через точки ');
write(imn,'(',t[imn].x:0:2,';',t[imn].y:0:2,') и ');
writeln(jmn,'(',t[jmn].x:0:2,';',t[jmn].y:0:2,')');
write('Точек слева=',lv,' справа=',pr);
readln;
xc:=0;
initgraph(xc,yc,'');
xc:=getmaxX div 2;
yc:=getmaxY div 2;
if c.x<c.y then min:=c.x-r else min:=c.y-r;
if c.x>c.y then max:=c.x+r else max:=c.y+r;
for i:=1 to n do
 begin
  if t[i].x<min then min:=t[i].x;
  if t[i].y<min then min:=t[i].y;
  if t[i].x>max then max:=t[i].x;
  if t[i].y>max then max:=t[i].y;
 end;
if max>abs(min) then ms:=(yc-40)/max
else ms:=(yc-40)/abs(min);
{окружность}
setcolor(9);
circle(xc+round(c.x*ms),yc-round(c.y*ms),round(r*ms));
{построение прямой}
x1:=xc+round(t[imn].x*ms);
y1:=yc-round(t[imn].y*ms);
x2:=xc+round(t[jmn].x*ms);
y2:=yc-round(t[jmn].y*ms);
{вертикальная}
if x1=x2 then
 begin
  x:=x1;
  y:=0;
  while y<getmaxY do
   begin
    putpixel(round(x),round(y),11);
    y:=y+0.1;
   end
 end
{горизонтальная}
else if y1=y2 then
 begin
  x:=0;
  y:=y1;
  while x<getmaxX do
   begin
    putpixel(round(x),round(y),11);
    x:=x+0.1;
   end
 end
{остальные}
else
 begin
  x:=0;
  k1:=(y1-y2)/(x2-x1);
  b:=y2+x2*k1;
  while x<=getmaxX do
   begin
    y:=-round(k1*x-b);
    if(y>0)and(y<getmaxY) then putpixel(round(x),round(y),11);
    x:=x+0.1;
   end;
 end;
{все точки}
for i:=1 to n do
 begin
  x1:=xc+round(t[i].x*ms);
  y1:=yc-round(t[i].y*ms);
  str(i,s);
  setcolor(12);
  setlinestyle(0,0,3);
  circle(x1,y1,1);
  setcolor(15);
  outtextXY(x1+5,y1,s);
 end;
{точки в круге}
for k:=1 to m do
 begin
  x1:=xc+round(t1[k].x*ms);
  y1:=yc-round(t1[k].y*ms);
  v:=(t[jmn].x-t[imn].x)*(t1[k].y-t[imn].y)-(t[jmn].y-t[imn].y)*(t1[k].x-t[imn].x);
  if v>0 then setcolor(10)
  else if v<0 then setcolor(14);
  setlinestyle(0,0,3);
  if v<>0 then circle(x1,y1,1);
 end;
{точки на линии}
setcolor(11);
x1:=xc+round(t[imn].x*ms);
y1:=yc-round(t[imn].y*ms);
circle(x1,y1,2);
x1:=xc+round(t[jmn].x*ms);
y1:=yc-round(t[jmn].y*ms);
circle(x1,y1,2);
readln
end.
2
4 / 4 / 1
Регистрация: 22.01.2011
Сообщений: 81
13.11.2011, 16:03 4
как такое можно виучить?????????77
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
13.11.2011, 16:06 5
Цитата Сообщение от baykonur Посмотреть сообщение
как такое можно виучить?????????77
Выучить это наверное нельзя, а применив основные возможности языка, немного зная алгебру и геометрию, включив мозг, все это можно написать.
0
13.11.2011, 16:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2011, 16:06
Помогаю со студенческими работами здесь

Определить число точек, попадающих в произвольно задаваемый круг и среднее значение содержания этих точек
Задание: а) Матрица из (N,3) чисел, где N - количество проб, предс*тавляет собой данные площадного...

Даны 3 точки. Определить положение точек на плоскости. Вывести сообщение какой четверти плоскости они принадлежат
Даны 3 точки А(х1,y1), B(х2,y2), C(х3,y3) Определить положение точек на плоскости. Вывести...

В заданном множестве точек плоскости найти количество точек в каждой из четвертей
В заданном множестве точек плоскости найти количество точек в каждой из четвертей

Задано N точек на плоскости: подсчитать количество точек попавших в заданную область
1. Записать логическое выражение соответствующие заданной области истинности 2. Составить...

В заданном множестве точек плоскости найти количество точек в каждой из четвертей
В заданном множестве точек плоскости найти количество точек в каждой из четвертей. Знаете я не...

На плоскости заданы своими координатами n точек. Определить расстояния от каждой из точек до другой
На плоскости заданы своими координатами n точек.Создать массив размером n(n-1), элементами которого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru