1 Востаннє редагувалося tarasgavrilov (14.06.2013 17:15:07)

Тема: курсор у колі

допоможіть розібратися з програмою. вона повинна адекватно показувати номер вершини. і якщо трикутик і трапеції правильно показують, то квадрат - не зовсім. потрібен свіжий погляд і свіжа думка. вже замаївся.
ось коди:
процедури

{=========================================================}
function NumPoint(n:integer;det:array of point;xcurf,ycurf:real):integer;
var Nmin,i:integer;
    dmin,d:real;
begin
dmin:=1000;//sqrt(sqr(det[0].x-xcurf)+sqr(det[0].y-ycurf));
Nmin:=0;
for i:=0 to n-1 do begin
d:=sqrt(sqr(det[i].x-xcurf)+sqr(det[i].y-ycurf));
if d<dmin then begin
 dmin:=d; Nmin:=i;
               end;
                   end;

NumPoint:=nmin;
end;
{=========================================================}
function NumPoint2(n:integer;det:array of point;mxy,xce,yce,R,xcur,ycur:real):integer;
var xq,yq,Nmin,i,ro:integer;
    xr,yr,phi:real;
begin
for i:=0 to n-1 do begin
 for ro:=0 to 360 do begin
  phi:=ro*pi/180;
  xr:=(det[i].x*mxy+xce+R*cos(phi));
  yr:=(-det[i].y*mxy+yce+R*sin(phi));
  xq:=round(xr);
  yq:=round(yr);
  fmain.image1.canvas.Pixels[Xq,Yq]:=clgreen;
  if (xcur<=det[i].x*mxy+xce+R*cos(phi)) and
   (ycur<=-det[i].y*mxy+yce+R*sin(phi)) then Nmin:=i;
  if nmin>=n-1 then nmin:=nmin-(n-1);
                           end;
  fMain.Edit1.Text:=fMain.Edit1.Text+floattostr(det[i].x)+floattostr(det[i].y)+inttostr(i)+' ';//
                      end;
NumPoint2:=nmin;
end;
{=========================================================}

і виклику

procedure TfMain.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
edit1.Clear;
xcurf:=Xc[nd_n]+(x-xe)/mashim1;
ycurf:=Yc[nd_n]-(y-ye)/mashim1;
if button=mbleft then
 nv:=NumPoint(kilkpointdet[nd_n],dets[nd_n],xcurf,ycurf);
if button=mbright then
 nv:=NumPoint2(kilkpointdet[nd_n],dets[nd_n],mashim1,xe,ye,20,x,y);
fMain.Caption:=inttostr(nv);
//ChangePointPos(kilkpointdet[nd_n],dets[nd_n],nv,x,y);
//DelPoint(kilkpointdet[nd_n],dets[nd_n],nv);
//image1.Picture:=nil; //íà ÷èñòîìó ìàëþíêó çîáðàçèòè ëèøå íåðóõîìó äåòàëü
//graphim1(kilkpointdet[nd_n],dets[nd_n],mashim1,xe,ye,0,0,1,1);
end;
Post's attachments

DETMODEL.rar 268.36 kb, 460 downloads since 2013-06-14 

Подякували: Replace1

2

Re: курсор у колі

Демка не стартує, бо їй бракує qtintf.dll і напевно іще чогось.

Подякували: tarasgavrilov1

3

Re: курсор у колі

і все таки не подивитесь?

4

Re: курсор у колі

Я не бачу ніякої принципової різниці між вершинами різних геометричних фігур. Принаймні той код, що ви виклали, можна застосовувати до усіх. Потрібно лише, щоб вони були записані в масив det, але коду його заповнення ви не показали.

Подякували: tarasgavrilov1

5

Re: курсор у колі

Допоможіть розібратися з програмою. вона повинна адекватно показувати номер вершини. І якщо трикутик і трапеції правильно показують, то квадрат - не зовсім. Потрібен свіжий погляд і свіжа думка. Вже замаївся.
Я хочу, щоб коли натиснули в межах кілець, то виводились номера вершин, а коли в інших місцях, то відображалась назва форми.

Post's attachments

DETMODEL.rar 256.59 kb, 407 downloads since 2013-06-27 

6

Re: курсор у колі

Може й подивлюся на код, якщо перекомпілюєте в юнікод.

Подякували: tarasgavrilov1

7

Re: курсор у колі

Тобто як?

8 Востаннє редагувалося Очі.завидющі (27.06.2013 20:35:09)

Re: курсор у колі

tarasgavrilov написав:

Тобто як?

В мене так:
http://replace.org.ua/misc.php?action=pun_attachment&amp;item=192&amp;download=0

Post's attachments

sh.JPG 18.55 kb, 276 downloads since 2013-06-27 

Подякували: tarasgavrilov1

9

Re: курсор у колі

Вибачте,не знаю, можливо треба разархівувати.У мене показує нормально.Заздалегідь вдячний.

10

Re: курсор у колі

Очі.завидющі
У вас щось не так з компом.

tarasgavrilov
Рекомендую вам подумати над алгоритмом переводу координат курсора у вашу внутрішню систему координат. Щоб вам легше думалося, додайте отакий код відображення положення курсора у Image1MouseDown:

Image1.Canvas.TextOut(round((xcurf)*mashim1+xe), round((-ycurf)*mashim1+ye),
  'cur'); {на основі алгоритму з graphim1}

А взагалі у вас було б значно менше проблем, якби ви замість того, щоб дублювати всюди код переводу координат, винесли його у окремі функції. Щось типу такого:

function ScreenToInternal(p: point): point;
function InternalToScreen(p: point): point;

І взагалі візьміть собі за правило ніколи не дублювати код. Якщо він потрібен вам у декількох місцях, то винесіть його у функцію чи процедуру.

Подякували: tarasgavrilov1

11

Re: курсор у колі

Torbins написав:

Очі.завидющі
У вас щось не так з компом.

ну навіщо ж так жорстко?

12

Re: курсор у колі

Torbins написав:

tarasgavrilov
Рекомендую вам подумати над алгоритмом переводу координат курсора у вашу внутрішню систему координат. Щоб вам легше думалося, додайте отакий код відображення положення курсора у Image1MouseDown:

Image1.Canvas.TextOut(round((xcurf)*mashim1+xe), round((-ycurf)*mashim1+ye),
  'cur'); {на основі алгоритму з graphim1}

я перевірив і дійсно - щось я перемудрив з переводом координат.

Torbins написав:

А взагалі у вас було б значно менше проблем, якби ви замість того, щоб дублювати всюди код переводу координат, винесли його у окремі функції. Щось типу такого:

function ScreenToInternal(p: point): point;
function InternalToScreen(p: point): point;

І взагалі візьміть собі за правило ніколи не дублювати код. Якщо він потрібен вам у декількох місцях, то винесіть його у функцію чи процедуру.

дуже корисна порада.ще раз дякую

13

Re: курсор у колі

я додумався, та не до кінця. ось дивіться

function NumPoint2(n:integer;det:array of point;mxy,xce,yce,R,xcur,ycur:real):integer;
var xq,yq,Nmin,i,ro:integer;
    xr,yr,phi:real;
begin
Nmin:=0;
for i:=0 to n-1 do begin
  for ro:=0 to 360 do begin
  phi:=ro*pi/180;
  xr:=(det[i].x*mxy+xce+R*cos(phi));
  yr:=(-det[i].y*mxy+yce+R*sin(phi));
  xq:=round(xr);
  yq:=round(yr);
  fmain.image1.canvas.Pixels[Xq,Yq]:=clgreen;
  if det[i].x<>det[i+1].x then
   if ((phi<=90) or (phi>=270)) and ((phi<=180)) then
    if (xcur<=xr) and (ycur<=yr) then Nmin:=i;
                      end;
                   end;
if nmin>=n-1 then nmin:=nmin-(n-1);
NumPoint2:=nmin;
end;

14

Re: курсор у колі

і додаток

Post's attachments

DETMODEL.rar 255.83 kb, 403 downloads since 2013-07-05 

15

Re: курсор у колі

tarasgavrilov написав:
Torbins написав:

Очі.завидющі
У вас щось не так з компом.

ну навіщо ж так жорстко?

Це Torbins ніколи не замислювався про можливість існування англійської локалізації та налаштувань кодової сторінки. Можливо на пострадянських теренах це дійсно щось не так, а лінукс на десктопі це взагалі збочення.

Подякували: tarasgavrilov1

16

Re: курсор у колі

tarasgavrilov
Що з цим кодом не так?

Очі.завидющі
Ну якщо ви в курсі, що для не юнікодних програм у вас вибрана англійська кодова сторінка, то навіщо було збивати усіх з пантелику?

Подякували: tarasgavrilov1

17

Re: курсор у колі

Torbins написав:

tarasgavrilov
Що з цим кодом не так?

А хто сказав, що з кодом щось не так? Сприймайте це так, що людина виклала свою роботу для наступних поколінь - раптом хтось шукатиме по відповідь саме на це питання, то й знайде.

Подякували: tarasgavrilov1

18

Re: курсор у колі

koala написав:
Torbins написав:

tarasgavrilov
Що з цим кодом не так?

А хто сказав, що з кодом щось не так? Сприймайте це так, що людина виклала свою роботу для наступних поколінь - раптом хтось шукатиме по відповідь саме на це питання, то й знайде.


з кодом все гаразд , просто на квадраті і деяких інших фігурах не правильно показує номер вершини може ви підкажете в чому справа? в прикріпленому файлі малюнок

Post's attachments

detmodel.bmp 1.31 mb, 612 downloads since 2013-07-06 

19

Re: курсор у колі

А ви погляньте, які параметри ви передаєте в NumPoint і NumPoint2.

Подякували: tarasgavrilov1

20

Re: курсор у колі

красно дякую вельмишановні