Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.03.2019, 17:12   #1
Armageddets
Форумчанин
 
Регистрация: 30.06.2012
Сообщений: 145
По умолчанию Как рассчитать правильно координаты попадания в дартсе?

Доброго времени суток, уважаемые эксперты. Делаю игру Дартс. Столкнулся с проблемой. Координаты попадания в цель (и как итог - получаемые балы) иногда считает немного не правильно. Помогите найти ошибку или может по какой-то формуле попадания точек с окружность проще считать?

За основу взял центр круга и от него считаю абсолютную разницу координат выстрела и отнимаю центральную точку. В итоге беру наибольших сдвиг по координатам и считаю куда мы попали.

При выстреле еще случайно смещаю дротик, чтобы больше рандома было в точности.

Код и весь проект прилагаю:
Код:
randomize;
  Vistrel.X:=X+(random(200)-100);
  Vistrel.Y:=Y+(random(200)-100);
  if Vistrel.X<0 then Vistrel.X:=0;
  if Vistrel.X>350 then Vistrel.X:=350;
  if Vistrel.Y<0 then Vistrel.Y:=0;
  if Vistrel.Y>350 then Vistrel.Y:=350;

  Current:=3;
  Z:=60;
    //ochki nabrali
    a:=abs(175-Vistrel.X);
    b:=abs(175-Vistrel.Y);

    if a>=b then c:=a else c:=b;
    begin
    if c<=11 then Score1:=Score1+10;
    if (c>11) and (c<=31) then Score1:=Score1+8;
    if (c>31) and (c<=51) then Score1:=Score1+7;
    if (c>51) and (c<=71) then Score1:=Score1+6;
    if (c>71) and (c<=91) then Score1:=Score1+5;
    if (c>91) and (c<=111) then Score1:=Score1+4;
    if (c>111) and (c<=131) then Score1:=Score1+3;
    if (c>131) and (c<=151) then Score1:=Score1+2;
    if (c>151) and (c<=171) then Score1:=Score1+1;
    if (c>171) then Score1:=Score1+0;
    end;

    Stringgrid1.Cells[1,1]:=InttoStr(Score1);
Ссылка на проект:
Скачать Дартс
Armageddets вне форума Ответить с цитированием
Старый 17.03.2019, 22:30   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

простите, а разве поле в Darts выглядит не так?
375px-Dartboard_diagram.svg.png
вики - https://en.wikipedia.org/wiki/Darts
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.03.2019, 22:53   #3
Armageddets
Форумчанин
 
Регистрация: 30.06.2012
Сообщений: 145
По умолчанию

Классическое - да. Но есть разные варианты и разные правила игры. В данном случае выбрана самая простая мишень.
Armageddets вне форума Ответить с цитированием
Старый 17.03.2019, 23:57   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Почему бы расстояние от центра не считать или его квадрат? А то какой-то странный способ оценки положения точки относительно центра окружности. А если усложнить и считать угол, то можно и сектор определить, ну это так, вдруг настоящую мишень дартса захочешь использовать )
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 18.03.2019 в 00:00.
Аватар вне форума Ответить с цитированием
Старый 18.03.2019, 10:06   #5
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 979
По умолчанию

По факту, как понял, тебе надо вычислить радиус относительно какого то центра. так и используй формулу круга. (х-а)^2+(y-b)^2=R^2
тебе надо найти R=((x-a)^2+(y-b))^0.5 и потом проверять какой радиус по твоим if. где a-центр по х (175), b-центр по y (175), x координата дротика гризонтальная y координата вертикальная.

да и if лучше заменить на case или использовать else.
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.

Последний раз редактировалось IliaIT; 18.03.2019 в 10:11.
IliaIT вне форума Ответить с цитированием
Старый 18.03.2019, 20:06   #6
Armageddets
Форумчанин
 
Регистрация: 30.06.2012
Сообщений: 145
По умолчанию

Спасибо. Формула круга идеально подошла. Спасибо огромное!
Armageddets вне форума Ответить с цитированием
Старый 22.03.2019, 22:35   #7
leoparrd
Заблокирован
 
Регистрация: 27.08.2010
Сообщений: 37
По умолчанию

Ничего собственно рассчитывать не надо и не надо никаких формул. Есть простейшие алгоритмы, даже не алгоритмы а способы, реализовать куда и что попало. Они используются во всех профессиональных играх.
Причём само поле в вашем случае может быть любое. И не только круги, а самые замысловатые фигуры.
Но, как вижу, вам этого уже не надо. Впрочем если всё же вас это заинтересует, пишите в личку. Я помогу вам.
leoparrd вне форума Ответить с цитированием
Старый 23.03.2019, 12:09   #8
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Я бы для классического поля так бы сделал
Код:
uses math;
...
const Angle2Points=array [0..19] of Integer= (1,18,4,13,6,10,15,2,17,3,19,7,16,8,11,14,9,12,5,20);
...

R:=hypot(x-x_center,y-y_center);
Angle:=Arctan2(y-y_center,x-x_center);

points:=Angle2Points[round((Angle+2*pi/20/2)/2/pi*20) mod 20];
if (r<30) then points:=100
 else if (r<50) then points:=60
  else  if (100<r) and (r<125) then points:=points*3
   else if (200<r) and (r<225) then points:=points*2
     else if (r>=225) then points:=0;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 28.03.2019, 12:52   #9
Armageddets
Форумчанин
 
Регистрация: 30.06.2012
Сообщений: 145
По умолчанию

Спасибо за советы. Все таки пришлось по требованию преподавателя переделать под стандартную мишень. Но столкнулся с проблемой. У меня почему-то для нижней части мишени вроде считает правильно, а вот для верхней части - выдает неправильные результаты. Ошибка явно в формуле, которую я пытался адаптировать, но не могу понять где именно. Подскажите где я ошибся, пожалуйста.

Для наглядности я сделал показ угла, радиуса и набранных очков при движении мышкой над мишенью в заголовке формы.

Код:

const Angle2Points:array [0..19] of Integer= (13,6,10,15,2,17,3,19,7,16,8,11,14,9,12,5,20,1,18,4);

procedure TForm2.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var points:real;
begin
    R:=hypot(X-175,Y-175);
    Angle:=Arctan2(Y-175,X-175);

    points:=Angle2Points[round((Angle+4*pi/20/2)/2/pi*20) mod 20];
    if (r<5) then points:=100 else
    if (r<13) then points:=60 else
    if (76<r) and (r<90) then points:=points*3 else
    if (129<r) and (r<140) then points:=points*2 else
    if r>=140 then points:=0;

    form2.Caption:='R='+Floattostr(R)+' | Angle='+Floattostr(Angle)+' | Points='+Floattostr(points);
end;
Весь проект можно скачать тут:
https://dropmefiles.com/lzauw
Armageddets вне форума Ответить с цитированием
Старый 28.03.2019, 13:55   #10
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

2*pi накинуть чтобы угол был положительным.
Код:
  points:=Angle2Points[round((2*Pi+Angle+4*pi/20/2)/2/pi*20) mod 20];
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Даны координаты трёх точек, являющихся вершинами некоторого параллелограмма. Найти координаты четвертой вершины. yamato_pm Паскаль, Turbo Pascal, PascalABC.NET 1 18.12.2013 19:42
Подъёмная сила крыла. Как правильно рассчитать ? pompiduskus Свободное общение 7 05.10.2013 22:12
Как правильно расположить изображение на веб-странице, задав его координаты в CSS? Michael_Ardan HTML и CSS 2 07.02.2013 19:07
Не правильно исчисляются координаты. pastuhdima Помощь студентам 2 17.11.2011 16:09
Как правильно получить координаты по клику на ячейку таблицы? Stilet JavaScript, Ajax 3 26.08.2009 16:19