Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Hellte

Погрешность отображения точек на карте местности

13.05.2010, 12:59. Показов 920. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Написал программу, которая по 2-ум заданным точкам и углом, расчитывает место расположения цели. Так вот не могли бы вы мне помочь добавить в неё некую погрешность, которая будет отображать не просто точку, а ещё и радиус вокруг неё. Т.е. чем больше я ввожу данных, тем радиус вокруг точки уменьшается

Пишу в Borland C++ Builder 6.0

C++
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
void __fastcall TMainForm::GetResMenuClick(TObject *Sender)
{
if(checkInput(0))//åñëè âõîä âåðíûé
        {
        FloatPoint P;
        //î÷èñòêà ìàññèâîâ
        DataArray.Clear();
        ResultArray.Clear();
 
        //Âûáîð èíôîðìàöèè î ïåðâîé òî÷êå
        ResultGrid->RowCount=CoordsGrid->RowCount-1;
        P.X=StrToFloat(CoordsGrid->Cells[0][1]);
        P.Y=StrToFloat(CoordsGrid->Cells[1][1]);
        //Íà÷àëüíàÿ óñòàíîâêà ðàçìåðîâ ìèðîâîãî îêíà
        dimX=P;
        dimY=P;
        //Îáíóëåíèå ñðåäíåãî çíà÷åíèÿ èñêîìîé òî÷êè
        middle.X=0;
        middle.Y=0;
        numResPoints=0;
        DataArray+=P;//äîáàâëåíèå â ìàññèâ òî÷êè
        FloatPoint Line0,Line1,V;
        double phi;
 
        for(int i=2; i<CoordsGrid->RowCount; i++)
                {
                //Ñ÷èòûâàíèå î÷åðåäíîé òî÷êè èç ñåòêè
                P.X=StrToFloat(CoordsGrid->Cells[0][i]);
                P.Y=StrToFloat(CoordsGrid->Cells[1][i]);
                DataArray+=P;//äîáàâëåíèå â ìàññèâ
                //Îáíîâëåíèå ðàçìåðîâ ìèðîâîãî îêíà
                if(P.X<dimX.X)
                        dimX.X=P.X;
                if(P.X>dimX.Y)
                        dimX.Y=P.X;
                if(P.Y<dimY.X)
                        dimY.X=P.Y;
                if(P.Y>dimY.Y)
                        dimY.Y=P.Y;
 
                //Âû÷èñëåíèå âåêòîðà äâèæåíèÿ
                V.X=P.X-DataArray[i-2].X;
                V.Y=P.Y-DataArray[i-2].Y;
                if(i==2) //äëÿ ïåðâîé òî÷êè íåîáõîäèìî òàêæå âû÷èñëèòü çíà÷åíèÿ
                        {
                        phi=StrToFloat(CoordsGrid->Cells[2][i-1]);//ïîëó÷åíèå óãëà èç ñåòêè
                        Line0=BuildStraight(V,DataArray[i-2],phi);//ïîñòðîéêà ïðÿìîé
                        }
                phi=StrToFloat(CoordsGrid->Cells[2][i]);//ïîëó÷åíèå óãëà èç ñåòêè
                Line1=BuildStraight(V,DataArray[i-1],phi);//ïîñòðîéêà ïðÿìîé
                ResultArray+=SearchPoint(Line0,Line1);//Ïîèñê òî÷êè è äîáàëåíèå åå â ðåçóëüòèðóþùèé ìàññèâ
                if(ResultArray[i-2].X!=INT_MAX)//åñëè ïðÿìûå íå ïàðàëëåëüíû
                        {
                        //Îáíîâëåíèå ðàçìåðîâ ìèðîâîãî îêíà
                        if(ResultArray[i-2].X<dimX.X)
                                dimX.X=ResultArray[i-2].X;
                        if(ResultArray[i-2].X>dimX.Y)
                                dimX.Y=ResultArray[i-2].X;
                        if(ResultArray[i-2].Y<dimY.X)
                                dimY.X=ResultArray[i-2].Y;
                        if(ResultArray[i-2].Y>dimY.Y)
                                dimY.Y=ResultArray[i-2].Y;
                        //Äîáàâëåíèå ê ñðåäíåìó çíà÷åíèÿ òî÷êè
                        middle.X+=ResultArray[i-2].X;
                        middle.Y+=ResultArray[i-2].Y;
                        numResPoints++;
                        }
                Line0=Line1;
                }
        if(numResPoints)//Åñëè íàéäåíû òî÷êè
                {
                //Âû÷èñëåíèå ñðåäíåãî çíà÷åíèÿ
                middle.X/=numResPoints;
                middle.Y/=numResPoints;
                }
        DrawPoints(); //Íàðèñîâàòü ãðàô
        }
}
//---------------------------------------------------------------------------
Добавлено через 2 часа 24 минуты
код не полностью скинул)
C++
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
void TMainForm::DrawPoints()
{
//î÷èñòêà ýêðàíà
 
 
//Âûâîä òî÷åê íà ýêðàí
if(DataArray.sizeArray()>0&&ResultArray.sizeArray()>0)//Åñëè èìåþòñÿ òî÷êè äëÿ âûâîäà
        {
        int Xout,Yout;
        float Vl=0, Vr=PictureImage->Width, Wl=dimX.X-3, Wr=dimX.Y+3;//Óñòàíîâêà ìèðîâîãî îêíà è ïîðòà ïðîñìîòðà
        //Âû÷èñëåíèå êîýôôèöèåíòîâ ïðåîáðàçîâàíèÿ èç ìèðîâîãî îêíà â ïîðò ïðîñìîòðà
        float A,B,C,D;
        A=(Vr-Vl)/(Wr-Wl);
        C=Vl-A*Wl;
        Vl=0; Vr=PictureImage->Height; Wl=dimY.X-3; Wr=dimY.Y+3;
        B=(Vr-Vl)/(Wr-Wl);
        D=Vl-B*Wl;
        PictureImage->Canvas->Brush->Color=clBlack;
        TRect rect;
        //Ðèñîâàíèå èñõîäíûõ òî÷åê
        for(int i=0; i<DataArray.sizeArray(); i++)
                {
                //óñòàíîâêà êîîðäèíàò òî÷åê íà êàíâå
                Xout=static_cast<int>(SimpleRoundTo(A*DataArray[i].X+C,0));
                Yout=PictureImage->Height-static_cast<int>(SimpleRoundTo(B*DataArray[i].Y+D,0));
                //ðèñîâàíèå îïîðíûõ òî÷åê
                rect.Left=Xout-3;
                rect.Right=Xout+3;
                rect.Top=Yout+3;
                rect.Bottom=Yout-3;
                PictureImage->Canvas->FillRect(rect);
                //ðèñîâàíèå ëèíèé
                if(!i)
                        PictureImage->Canvas->MoveTo(Xout,Yout);
                else
                        PictureImage->Canvas->LineTo(Xout,Yout);
                if(!i)
                        PictureImage->Canvas->Brush->Color=clBlue;
                }
        PictureImage->Canvas->Brush->Color=clRed;
        PictureImage->Canvas->Pen->Color=clRed;
        PictureImage->Canvas->Pen->Style=psDash;
        //Ðèñîâàíèå ïîëó÷åííûõ òî÷åê
        for(int i=0, j=0; i<ResultArray.sizeArray(); i++)
                if(ResultArray[i].X!=INT_MAX)
                        {
                        j++;
                        //Óñòàíîâêà êîîðäèíàò òî÷åê íà êàíâå
                        Xout=static_cast<int>(SimpleRoundTo(A*ResultArray[i].X+C,0));
                        Yout=PictureImage->Height-static_cast<int>(SimpleRoundTo(B*ResultArray[i].Y+D,0));
                        //âûâîä â ñåòêó çíà÷åíèé
                        ResultGrid->Cells[0][j]=SimpleRoundTo(ResultArray[i].X,-2);
                        ResultGrid->Cells[1][j]=SimpleRoundTo(ResultArray[i].Y,-2);
                        //ðèñîâàíèå îïîðíîé òî÷êè
                        rect.Left=Xout-3;
                        rect.Right=Xout+3;
                        rect.Top=Yout+3;
                        rect.Bottom=Yout-3;
                        PictureImage->Canvas->FillRect(rect);
 
                        //ðèñîâàíèå ëèíèé
                        PictureImage->Canvas->MoveTo(Xout,Yout);
                        PictureImage->Canvas->LineTo(static_cast<int>(A*DataArray[i].X+C),PictureImage->Height-static_cast<int>(B*DataArray[i].Y+D));
                        PictureImage->Canvas->MoveTo(Xout,Yout);
                        PictureImage->Canvas->LineTo(static_cast<int>(A*DataArray[i+1].X+C),PictureImage->Height-static_cast<int>(B*DataArray[i+1].Y+D));
                        }
        //Ðèñîâàíèå ñðåäíåé òî÷êè
        if(numResPoints)
                {
                Xout=static_cast<int>(SimpleRoundTo(A*middle.X+C,0));
                Yout=PictureImage->Height-static_cast<int>(SimpleRoundTo(B*middle.Y+D,0));
                rect.Left=Xout-5;
                rect.Right=Xout+5;
                rect.Top=Yout-5;
                rect.Bottom=Yout+5;
                PictureImage->Canvas->Brush->Color=clGreen;
                PictureImage->Canvas->FillRect(rect);
                }
        }
}
//---------------------------------------------------------------------------
//ïîñòðîåíèå ïðÿìîé ïî âåêòîðó, òî÷êå è óãëó ïðèõîäÿùåãî ñèãíàëà
FloatPoint BuildStraight(FloatPoint V, FloatPoint M,double alpha)
{
FloatPoint Straight;
 
alpha=DegToRad(alpha);//ïåðåâîä ãðàäóñîâ â ðàäèàíû
//åäèíè÷íûé âåêòîð â ëîêàëüíûõ êîîðäèíàòàõ
FloatPoint T;
T.X=cos(alpha);
T.Y=sin(alpha);
//íàïðÿâëÿþùèå êîñèíóñ è ñèíóñ âåêòîðà äâèæåíèÿ
FloatPoint Direct;
Direct.X=V.Y/sqrt(pow(V.X,2)+pow(V.Y,2));
Direct.Y=V.X/sqrt(pow(V.X,2)+pow(V.Y,2));
//åäèíè÷íûé âåêòîð â ãëîáàëüíûõ êîîðäèíàòàõ
FloatPoint Global;
Global.X=T.X*Direct.X+T.Y*Direct.Y;
Global.Y=T.Y*Direct.X-T.X*Direct.Y;
//ïîñòðîåíèå ïðÿìîé
Straight.X=Global.Y/Global.X;
Straight.Y=M.Y-Straight.X*M.X;
 
return Straight;
}
//---------------------------------------------------------------------------
//ïîèñê òî÷êè ïåðåñå÷åíèÿ äâóõ ïðÿìûõ
FloatPoint SearchPoint(FloatPoint S0, FloatPoint S1)
{
FloatPoint result;
if(S1.X-S0.X)//åñëè ïðÿìûå íå ïàðàëëåëüíû
        {
        result.X=(S0.Y-S1.Y)/(S1.X-S0.X);
        result.Y=S0.X*result.X+S0.Y;
        }
else
        {
        result.X=INT_MAX;
        result.Y=INT_MAX;
        }
 
return result;
}
//--------------------------------------------------------------------------
//âû÷èñëåíèå óãëà â ëîêàëüíûõ êîîðäèíàòàõ èçìåðèòåëÿ Ì îò èñòî÷íèêà ñèãíàëà S
double GetAngle(FloatPoint V, FloatPoint M, FloatPoint S)
{
double angle;
//Âåêòîð èñòî÷íèêà ñèãíàëà â ãëîáàëüíûõ êîîðäèíàòàõ
S.X-=M.X;
S.Y-=M.Y;
//Íàïðàâëÿþùèå êîñèíóñ è ñèíóñ âåêòîðà äâèæåíèÿ
FloatPoint VAngle;
VAngle.X=V.Y/sqrt(pow(V.X,2)+pow(V.Y,2));
VAngle.Y=V.X/sqrt(pow(V.X,2)+pow(V.Y,2));
//âåêòîð èñòî÷íèêà ñèãíàëà â ëîêàëüíûõ êîîðäèíàòàõ
FloatPoint Ml;
Ml.X=S.X*VAngle.X-S.Y*VAngle.Y;
Ml.Y=S.Y*VAngle.X+S.X*VAngle.Y;
//íàïðàâëÿþùèå êîñèíóñ è ñèíóñ âåêòîðà èñòî÷íèêà ñèãíàëà
FloatPoint MAngle;
MAngle.X=Ml.X/sqrt(pow(Ml.X,2)+pow(Ml.Y,2));
MAngle.Y=Ml.Y/sqrt(pow(Ml.X,2)+pow(Ml.Y,2));
//îïðåäåëåíèå çíà÷åíèÿ óãëà
angle=RadToDeg(fabs(acos(MAngle.X)));
//îïðåäåëåíèå çíàêà óãëà
if(MAngle.Y>=0)
        return angle;
else
        return -angle;
}
Добавлено через 18 часов 40 минут
Вопрос остался актуальным. Помогите пожалуйста
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.05.2010, 12:59
Ответы с готовыми решениями:

Создание рельефа по карте местности
Здравствуйте! Подскажите пожалуйста с помощью чего это можно реализовать? И если можно, то некоторые примеры кода привести.(можно...

Вывести номера точек местности (элементов массива)
Даны натуральное число N (N&lt;=60) и массив A(N). В этом массиве хранятся значения высот некоторого участка местности (вводятся пользователем...

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.05.2010, 12:59
Помогаю со студенческими работами здесь

Использование данных из dataGridView для отображения на карте
Есть такая проблема. В Form1 создан gMapControl1private void gMapControl1_Load(object sender, EventArgs e) { ...

программа для отображения объекта на карте по координатам
задача такая я задаю координаты объекта программа отображает объект на карте! могу я как то использовать Google Maps или же готовую карту...

Разработка приложения для отображения местоположения пользователей на карте
Доброго времени суток! Собираюсь разработать приложение по типу &quot;Find my friends&quot; или &quot;Locate my friends&quot; под Android. По сути,...

Плагин для отображения на карте определенных линий, маршрутов (кроме меток)
Нужен продвинутый free плагин для визуального рисования и отображения на карте (Yandex, например, и др) не только разных меток, но...

Сделать позицию на карте не зависящей от плотности точек на экране
Делаю карту На карте маркер под ним круг Код маркера LatLong point = new...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru