Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 12.02.2019
Сообщений: 11

Векторное сложение двух контуров

12.02.2019, 15:49. Показов 2799. Ответов 24
Метки mfc (Все метки)

Студворк — интернет-сервис помощи студентам
Мне нужно нарисовать контура и определить направление обхода координат. Нужно считать данные из txt файла, координаты в файле заданы последовательно и обход контура либо по часовой стрелке, либо против. Я так понимаю нужно векторно сложить вектора и если в результате будет +360 то это по часовой, а если -360 против часовой.

У меня получилось считать данные и вывести конур на экран, но как сейчас мне векторное сложение не понимаю. Помогите пожалуйста


Тут читаю
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
// команды CDPLDoc
 
void CDPLDoc::On32771()
//Кнопка Чтение
{
    char    szBuffer[100];
    char    inpd[100];
    const char r[] = "r";
    FILE *myFile;
    fopen_s(&myFile, "C:\\Users\\acer-Pro\\Desktop\\test.txt", r);
    fscanf_s(myFile, "%d", &n);
    
    for (int i = 0; i < n; i++)
    {
        fscanf_s(myFile, "%lf %lf", &docs[i][0], &docs[i][1]);
    }
    
    UpdateAllViews(NULL);
}
 
 
Тут вывожу
// рисование CDPLView
 
void CDPLView::OnDraw(CDC* pDC)
 
{
    CDPLDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
    CPoint Pt[100];
 
    
    for (int i = 0; i < pDoc->n; i++)
    {
        Pt[i] = CPoint(pDoc->docs[i][0], pDoc->docs[i][1]);
    }
    pDC->Polyline(Pt, pDoc->n);
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.02.2019, 15:49
Ответы с готовыми решениями:

Конкатенация двух нибблов (сложение двух полубайт в байт)
Как из этих двух полубайт получить полноценный байт со значение &quot;0x3e&quot;? unsigned char first_nibbl = 0x03 unsigned char last_nibbl =...

Решить векторное сложение 2 векторов
Помогите пожалуйста решить векторное сложение 2 векторов на php . Не могу справиться, нужно чтобы пользователь вводил данные в форму и...

Сложение, скалярное и векторное произведение векторов
Разработать программу с интерфейсом в среде программирования Lazarus. 9.5. Создать класс вектор на плоскости, поля класса_координаты...

24
 Аватар для Михаиллллллл
66 / 57 / 13
Регистрация: 16.03.2017
Сообщений: 426
12.02.2019, 17:44
Покажите, что у вас в txt
0
391 / 64 / 11
Регистрация: 06.08.2018
Сообщений: 202
12.02.2019, 17:55
Цитата Сообщение от Оптимистка Посмотреть сообщение
Я так понимаю нужно векторно сложить вектора и если в результате будет +360 то это по часовой, а если -360 против часовой.
Вот тут вы, видимо, и непонимание прячется, судя по вашей формулировке. Давайте разбираться.
Что вы имеете в виду под "векторно сложить вектора"? Если вы складываете два вектора, то получаете вектор, а не угол... Тогда какое действие вам нужно сделать, если не сложить?
1
391 / 64 / 11
Регистрация: 06.08.2018
Сообщений: 202
13.02.2019, 11:08
Ну как продвигается? Какие идеи по поводу векторных операций? Просто переберите в голове какие операции можно делать с векторами, какой результат дает каждая из этих операций и поймете что именно вам нужно.
0
0 / 0 / 0
Регистрация: 12.02.2019
Сообщений: 11
13.02.2019, 18:49  [ТС]
Вот что лежит у меня в txt. 7 - это количество координат. В данном случае обход по часовой

7
50 100
350 100
250 150
300 200
100 200
150 150
50 100
0
391 / 64 / 11
Регистрация: 06.08.2018
Сообщений: 202
13.02.2019, 19:11
Давайте рассуждать. Какие опрации с векторами бывают?
0
0 / 0 / 0
Регистрация: 12.02.2019
Сообщений: 11
13.02.2019, 19:12  [ТС]
Да, вы правы при векторном сложении векторов получается вектор. Это должно быть скалярное произведение
0
391 / 64 / 11
Регистрация: 06.08.2018
Сообщений: 202
13.02.2019, 19:15
лучше. Но,
скалярное проиведение может дать вам косиус угла (если поделить на произведение длин).
А косинус(угла) == косинус(-угла)...
Что еще можем сделать?
0
0 / 0 / 0
Регистрация: 12.02.2019
Сообщений: 11
13.02.2019, 19:32  [ТС]
Не пойму о чем вы сейчас, но скалярное произведение для двух векторов с координатами (x1; y1) и (x2; y2) вычисляется по формуле: x1x2 + y1y2, но тогда опять получается вектор. Тогда формула угла такая

https://www.cyberforum.ru/cgi-bin/latex.cgi?a=arccos ((x1*x2+y1*y2)/((x1^2 * x2^2)^1/2)((y1^2 * y2^2)^1/2))
0
391 / 64 / 11
Регистрация: 06.08.2018
Сообщений: 202
13.02.2019, 19:56
Я о том, что скалярное произведение тоже не поможет. Потому как знак угла получить не получится.
cos(alpha)=cos(-alpha).
Нужно что-то другое. Что еще бывает?

Добавлено через 8 минут
Про скалярное произведение подробнее:
формула такая: (a*b)=|a|*|b|*cos(alpha)
Здесь alpha - угол между векторами a и b,
|a|, |b| -длины этих векторов.
Левая часть уравнения считается, как выправильно заметили ax*bx+ay*by
Длины векторов тоже легко посчитать: |a|=sqrt(ax*ax+ay*ay), аналогично с |b|.
В итоге можем найти cos(alpha).
Но, увы, он нам направления обхда не подскажет.
Нужно что-то другое.

Добавлено через 6 минут
Поскольку мне пора идти и я не уверена когда смогу заглянуть в следующий раз, то, чтоб вас сильно не задервивать:
Обратите внимание на операцию векторное произведение. В результате будет вектор, но какой! Его направление/знак должно подсказать направление обхода, насколько я себе это представляю.
Как считать легко находится в гугле.
1
0 / 0 / 0
Регистрация: 12.02.2019
Сообщений: 11
13.02.2019, 20:22  [ТС]
Спасибо большое вам. Я так долго отвечаю потому что туплю и пытаюсь разобраться
0
391 / 64 / 11
Регистрация: 06.08.2018
Сообщений: 202
14.02.2019, 11:00
Я не имела намерения торопить. Наоборот - разбираться полезно
Просто реально надо было уходить.
Погуглили про векторное произведение?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
14.02.2019, 12:59
В чем проблема?
Определение. Скалярным произведением двух векторов называется число, равное произведению их длин на косинус угла между ними.
0
391 / 64 / 11
Регистрация: 06.08.2018
Сообщений: 202
14.02.2019, 13:18
Цитата Сообщение от _stanislav Посмотреть сообщение
В чем проблема?
Определение. Скалярным произведением двух векторов называется число, равное произведению их длин на косинус угла между ними.
в том, что скалярное не поможет Нужно векторное произведение
0
0 / 0 / 0
Регистрация: 12.02.2019
Сообщений: 11
14.02.2019, 21:49  [ТС]
Как-то так
Миниатюры
Векторное сложение двух контуров  
0
391 / 64 / 11
Регистрация: 06.08.2018
Сообщений: 202
15.02.2019, 00:44
Оно!
Результом будет вектор, перпендикулярный к обоим исходным векторам. Т.е., если векторы a и b лежали, например, в плоскости xy, то новый вектор будет вдоль оси z. А в какую сторону будет направлен (к примеру в + или - ) - зависит как раз от направления обхода. (погуглите правило Буравчика если не помните)
Теперь надо решить какие у нас вектора a и b и можно приступать к написанию кода
0
0 / 0 / 0
Регистрация: 12.02.2019
Сообщений: 11
19.02.2019, 16:06  [ТС]
Как я поняла. Учитывая что у меня контур задан только в плоскости x и y, то для того чтобы определить знак нужно координаты векторов перемножить так: а х b = ax * by - ay * bx. Если получится число со знаком плюс то против часовой стрелки, а если минус по часовой стрелке. Только не пойму пока, достаточно ли взять первые две по очереди в txt строчки со значениями координат или их нужно больше

Добавлено через 30 минут
Похоже нужно так делать с соседними векторами. А потом сложить всё вместе знак получившегося числа укажет по часовой или против часовой обход контура. Иначе могут быть ошибки определения направления обхода, проверила на небольших примерах. То есть если фигура четырехугольная нужно векторно перемножить a x b, b x c, c x d, d x a
0
391 / 64 / 11
Регистрация: 06.08.2018
Сообщений: 202
19.02.2019, 18:57
Д, т.к. az и bz равны нулю, то остается тол'ко (ax * by - ay * bx), заметьте, там стоит к. T.e. полученный вектор axb имеет координаты (0, 0, ax * by - ay * bx) - направлен вдоль +/- z. Все правильно, знак (ax * by - ay * bx) определяет в какую сторону обход.
Теперь про векторы a и b. У вас в txt файле, если я правильно понимаю, заданы НЕ вектора, а координаты точек. Если начало координат находится внутри фигуры, образуемой данными точками, то проблем быть не должно. (Предполагаю выпуклую фигуру, иначе надо подробнее думать). Т.е. мы берем координаты точек, но подразумеваем вектора из начала координат к данным точкам. Но, если начало координат вне, то получится, что часть векторных произведений даст обратный знак. Если я правильно поняла, то именно то, что вы имели жжиду здесь:
Цитата Сообщение от Оптимистка Посмотреть сообщение
Иначе могут быть ошибки определения направления обхода, проверила на небольших примерах.
Если начало координат снаружи описываемого контура, то вам нужно решить, какие вектора вы будете рассматривать.
Лично мне, если с ходу, то приходят в голову два варианта:
1) посчитаем координаты центра фигуры и будем считать, что все вектора имеют начало там (а конец, в тех точках). Таким образом, начало наших векторов внутри фигуры и не будет проблем со сменой знака, когда идем вдоль контура в одну сторону.
2) можно взять за начало всех векторов одну из точек, а концы вектров - оставшиеся точки. Таким образом, у нас на один вектор меньше.
Оба способа предполагают что фигура выпуклая. При этом, этими способами можно заодно и проверить соблюдается ли направление обхода (а то вдруг кто-то нам дал точки в произвольном порядке? 1423... или 1324...)
Возможно есть и другие способы. Это то, что мне первым в голову пришло.
1
0 / 0 / 0
Регистрация: 12.02.2019
Сообщений: 11
19.02.2019, 19:34  [ТС]
Теперь про векторы a и b. У вас в txt файле, если я правильно понимаю, заданы НЕ вектора, а координаты точек.
Да, у меня заданы координаты точек и порядок их последовательный, не предполагается что он может быть запутан.

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

Лично мне, если с ходу, то приходят в голову два варианта:
1) посчитаем координаты центра фигуры и будем считать, что все вектора имеют начало там (а конец, в тех точках). Таким образом, начало наших векторов внутри фигуры и не будет проблем со сменой знака, когда идем вдоль контура в одну сторону.
В дальнейшем предполагается что точек будет достаточно много поэтому думаю искать центр не лучший вариант.
0
391 / 64 / 11
Регистрация: 06.08.2018
Сообщений: 202
19.02.2019, 20:35
Цитата Сообщение от Оптимистка Посмотреть сообщение
предполагается что контур может быть невыпуклым, но линии не пересекаются
Тогда на некоторых учасках знак может переключаться на обратный, но зависит от выбора начала...
наверное сложение результатов попарного векторного произведения (если я правильно вас поняла вы это сейчас и делаете?) должно помочь. Длина нового вектора равна площади параллелограма, образованного исходными векторами, что логично, вроде бы как бы и взвешанное получается. Вроде все логично. Надо подумать не появится ли еще каких подводных камней...
Цитата Сообщение от Оптимистка Посмотреть сообщение
В дальнейшем предполагается что точек будет достаточно много поэтому думаю искать центр не лучший вариант.
Тогда может второй вариант? Если считать началом всех векторов первую точку?
(Считать началом векторов начало координат мне почему-то не нравится... хотя может я и не права - надо пробовать, смотреть как получается... а если начало координат очень далеко?...)

Добавлено через 8 минут
Еще такая мысль закралась... а вы потом собираетесь это для чего-то использовать? Или это упражнение "сдал и забыл" или зарядка для ума?
Если использовать потом, то я бы еще юниттесты написала бы для нескольких контуров, хорошо продумав какие контура могут быть наиболее интересны или проблемны

Добавлено через 26 минут

Не по теме:

Моя подпись хорошо подходит к вашему нику ;))))

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

Векторное сложение скоростей, найти скорость встречного ветра
Определить скорость встречного ветра, если пассажир автобуса, движущегося со скоростью 15м\с, заметил, что след капли дождя на боковом...

Преобразование схемы до двух контуров
Помогите преобразовать схему до двух контуров.

создание, сложение, вычитание векторов, скалярное и векторное умножение векторов
Есть задание по курсовой работе: надо разработать классы для реализации операций векторной алгебры: создание, сложение, вычитание...

Сила взаимодействия двух одинаковых плоских контуров в форме квадратов
Сила взаимодействия двух одинаковых плоских контуров в форме квадратов, через которые проходит ток, ровняется 192 мН. Расстояние между...

Векторная алгебра. Векторное произведение двух векторов
Определить длины диагоналей параллелограмма, построенного на векторах a = m + n и b = m - 2n, где m и n - еденичные векторы, угол между...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru