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

Вычисление косинуса угла между векторами, в чем ошибка

12.06.2012, 19:34. Показов 11979. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написать программу для вычисления косинуса
угла между векторами, заданными своими координатами
(скалярное произведение векторов делится на произведе-
ние модулей этих векторов) . Для вычисления скалярного
произведения и модуля вектора оформить отдельную
функцию.

Вот моя версия
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
#include <iostream>
#include <cmath>
#include <math.h>
#include <windows.h>
using namespace std; 
float cosin(float a,float b);
float b1,a1,co,x11,y11,x12,y12,x21,y21,x22,y22; 
int main()
{   setlocale (LC_ALL, "Russian");
    cout<<"\n введи координаты векторов x11,y11,x12,y12,x21,y21,x22,y22\n  ";
 cin>>x11>>y11>>x12>>y12>>x21>>y21>>x22>>y22;
a1=sqrt( ((x12-x11)*(x12-x11)) +  ((y12-y11)*(y12-y11)) );
b1=sqrt( ((x22-x21)*(x22-x21)) +  ((y22-y21)*(y22-y21)) );
cout<<"длины векторов "<<a1<<" "<<b1;
co=cosin(a1,b1); 
cout<<"\n"; cout<<"косинус угла= "<<co<<"\n";
return 0;}
 
float cosin(float b,float a)
{ float c,X1,Y1,X2,Y2;
X1= x12-x11;
Y1= y12-y11;
X2= x22-x21;
Y2= x22-x21;
c= ( (X1*X2) + (Y1*Y2) ) / ( (fabs(a) * fabs(b)) );
return (c); }
Добавлено через 1 минуту
Она как-бы правильная, но нужно поставить ограничение чтобы косинус углп больше 1 не считал

Добавлено через 2 минуты
Люди!!! Помогите!!! пожалуйста!!!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.06.2012, 19:34
Ответы с готовыми решениями:

Определение косинуса угла между двумя векторами
14 номер

Вычисление sin угла между векторами.
Вычислить синус угла между диагоналями параллелограмма, построенного на векторах:

вычисление синус угла между двумя векторами C#
Даны два вектора A,B ,необходимо найти синус угла между ними по формуле sin(U)=sqrt(1-cos^2(U)),как можно это реализовать с классом Vector...

21
0 / 0 / 1
Регистрация: 12.06.2012
Сообщений: 10
12.06.2012, 20:23
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
#include <iostream>
#include <cmath>
#include <math.h>
#include <windows.h>
using namespace std; 
float cosin(float a,float b);
float b1,a1,co,x11,y11,x12,y12,x21,y21,x22,y22; 
int main()
{   setlocale (LC_ALL, "Russian");
    cout<<"\n введи координаты векторов x11,y11,x12,y12,x21,y21,x22,y22\n  ";
 cin>>x11>>y11>>x12>>y12>>x21>>y21>>x22>>y22;
a1=sqrt( ((x12-x11)*(x12-x11)) +  ((y12-y11)*(y12-y11)) );
b1=sqrt( ((x22-x21)*(x22-x21)) +  ((y22-y21)*(y22-y21)) );
cout<<"длины векторов "<<a1<<" "<<b1;
co=cosin(a1,b1); 
if (co>=1) cout<<"Не существует"; else
cout<<"\n"; cout<<"косинус угла= "<<co<<"\n";
return 0;}
 
float cosin(float b,float a)
{ float c,X1,Y1,X2,Y2;
X1= x12-x11;
Y1= y12-y11;
X2= x22-x21;
Y2= x22-x21;
c= ( (X1*X2) + (Y1*Y2) ) / ( (fabs(a) * fabs(b)) );
return (c); }
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
12.06.2012, 20:29
В строке 24 используются не те координаты (икс вместо игрека).
1
0 / 0 / 0
Регистрация: 19.10.2011
Сообщений: 19
12.06.2012, 21:09  [ТС]
Огромное СПАСИБО!!!!!

Добавлено через 20 минут
Эх, к сожалению неправильно

Добавлено через 2 минуты
ввёл координаты где получается cos2=1
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
12.06.2012, 21:28
Цитата Сообщение от Менчендайзер Посмотреть сообщение
ввёл координаты где получается cos2=1
Поподробнее. Что ввёл, что получил?
0
0 / 0 / 0
Регистрация: 19.10.2011
Сообщений: 19
13.06.2012, 07:33  [ТС]
вот результат
Миниатюры
Вычисление косинуса угла между векторами, в чем ошибка  
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
13.06.2012, 11:07
Ну и что неправильно? Заданы 2 параллельных вектора. Угол между ними равен нулю. Косинус такого угла равен единице. Что не так?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.06.2012, 11:24
Господи ты боже мой - ну что за ерись тут написана вообще
Вот это длины векторов
Цитата Сообщение от web1720 Посмотреть сообщение
a1=sqrt( ((x12-x11)*(x12-x11)) + *((y12-y11)*(y12-y11)) );
b1=sqrt( ((x22-x21)*(x22-x21)) + *((y22-y21)*(y22-y21)) );
cout<<"длины векторов "<<a1<<" "<<b1;
А кто вам сказал вообще что они пересекаются либо пересекаются в точке которая одинакова для какого либо конца из векторов????!

grizlik78, претендуешь на логичность и носишь лэйбл эксперт, ну так потрудись найти точку пересечения векторов, затем найди длины открезков отсекаемых данной точкой на каждом векторе. Найди расстояние между концами векторов и потом уже используй формулу косинусов.
Ребята без обид вам обоим жирная пара по геометрии и алгебре особенно тебе
grizlik78, Эксперт C++.
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
13.06.2012, 11:30
-=ЮрА=-, если не в курсе чем вектор отличается от направленного отрезка, то помалкивал бы, а?
1
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.06.2012, 11:33
Для решения задачи нужно 1-е найти точку О пересечения векторов и если таковая есть (а ведь вектора могут быть параллельными или даже лежать на одной прямой), затем найти одну из длин отмеченную красным. А вот потом уже считать косинус
Миниатюры
Вычисление косинуса угла между векторами, в чем ошибка  
2
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.06.2012, 11:34
Цитата Сообщение от grizlik78 Посмотреть сообщение
-=ЮрА=-, если не в курсе чем вектор отличается от направленного отрезка, то помалкивал бы, а?
- насмешил меня
grizlik78, я как раз в курсе, а ты демонстрируешь полное незнание того о чём я написал выше, не обижайся я констатирую пока что факты
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
13.06.2012, 11:39

Не по теме:

-=ЮрА=-, да ты известный констататор и вычислятор бесконечностей.


Исходная программа верна (за исключением перепутанных по копировании координат). Вот это факт.
Чтобы между векторами можно было найти угол они не обязаны пересекаться. Это тоже факт.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.06.2012, 11:50
- итак мы заговорили о пересечении векторов)
Так вот если твои вектора в одной плоскости то либо пересекаются их продолжения (впрочем это называется линиями действия векторов или силовыми линиями, как тебе будет угодно) либо пересекаться так как указано на моём рисунке. И в том и другом случае между векторами есть угол
Если же говорим о векторах в пространстве то там нужно либо задание плоскостей либо смотреть углы пересечения их проекций.
Кстати вот тебе твой факт на рисунке,
Цитата Сообщение от grizlik78 Посмотреть сообщение
Чтобы между векторами можно было найти угол они не обязаны пересекаться.
, ну и что точка О находится вконце одной из точек задающих векторы, а ты именно из этого исходишь когда уголок то считаешь)
grizlik78, чувак сходи в школу!
Миниатюры
Вычисление косинуса угла между векторами, в чем ошибка  
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
13.06.2012, 11:55
Зачем приплетать сюда пространство, когда в исходной задаче координаты двухмерные?
Я разве говорил, что если 2 вектора не пересекаются, то между ними нет угла? Не приписывай мне свои фантазии. Угол как раз есть, а чтобы его найти вовсе не обязательно искать точку пересечения. Этому как раз в школе и учат. Прогуливал?
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.06.2012, 12:04
Цитата Сообщение от grizlik78 Посмотреть сообщение
Зачем приплетать сюда пространство, когда в исходной задаче координаты двухмерные?
Я разве говорил, что если 2 вектора не пересекаются, то между ними нет угла? Не приписывай мне свои фантазии. Угол как раз есть, а чтобы его найти вовсе не обязательно искать точку пересечения. Этому как раз в школе и учат. Прогуливал?
- о пространсве я речь завёл для полноты ответа, а на счёт остального, я тебе написал случай когда отстаиваемый тобой алгоритм будет давать неверный результат. Ты либо параллельный перенос вводи (с коррективом координат), либо будь добр находить точку пересечения.
Кстати точка пересечения - это решение системы
y0 = k1*x0 + b1
y0 = k2*x0 + b2
которую в школе решают уже в 5-м классе(впрочем видимо ты и вправду прогуливал школу раз этого не знаешь)Как находить угловой коэффициент и свободный член в уравнениях напоминать или ты всё же что-то из школы почерпнул?

Не по теме:

А школу да я прогуливал иногда труды иногда литературу, впрочем получил вполне заслуженную мной серебрянную медальку, а ты???Ну и диплом у меня тоже не синего а красного цвета. (Но по твоему раскладу, я конечно же купил и медаль и диплом и не умею писать код, а особенно не знаю геометрию и алгебру:D)

0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
13.06.2012, 12:08
Короче, хватит уже на личности переходить.
Давай в числах пример.
Такие-то координаты надо ввести, такой-то результат должен получится, а отстаиваемый мной метод здесь будет неправильно работать.
0
13.06.2012, 12:09

Не по теме:

Цитата Сообщение от grizlik78 Посмотреть сообщение
Короче, хватит уже на личности переходить.
Давай в числах пример.
Такие-то координаты надо ввести, такой-то результат должен получится, а отстаиваемый мной метод здесь будет неправильно работать.
- хорошо пара минут...

0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
13.06.2012, 12:17
grizlik78, вобщем смотри - это прямые которые пересекаются под прямым углом

(0;1) -> (1;2)
(0;-1) ->(1;-2)
Вот что вывела программа, а на втором рисунке пространственное расположение точек
В коде преобразовал лишь руссификацию(т.к. в данный момент у меня под рукой 6-ка). Код тоже выкладываю
Твой же код
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
#include <iostream>
#include <cmath>
#include <math.h>
#include <windows.h>
using namespace std; 
 
float cosin(float a,float b);
float b1,a1,co,x11,y11,x12,y12,x21,y21,x22,y22; 
int main()
{   
    system("chcp 1251");
    cout<<"\n ââåäè êîîðäèíàòû âåêòîðîâ x11,y11,x12,y12,x21,y21,x22,y22\n  ";
    cin>>x11>>y11>>x12>>y12>>x21>>y21>>x22>>y22;
    a1=sqrt( ((x12-x11)*(x12-x11)) +  ((y12-y11)*(y12-y11)) );
    b1=sqrt( ((x22-x21)*(x22-x21)) +  ((y22-y21)*(y22-y21)) );
    cout<<"äëèíû âåêòîðîâ "<<a1<<" "<<b1;
    co=cosin(a1,b1); 
    if (co>=1) 
        cout<<"Íå ñóùåñòâóåò"; else
    cout<<"\n"; cout<<"êîñèíóñ óãëà= "<<co<<"\n";
    return 0;
}
 
float cosin(float b,float a)
{ 
    float c,X1,Y1,X2,Y2;
    X1= x12-x11;
    Y1= y12-y11;
    X2= x22-x21;
    Y2= x22-x21;
    c= ( (X1*X2) + (Y1*Y2) ) / ( (fabs(a) * fabs(b)) );
return (c); 
}
Миниатюры
Вычисление косинуса угла между векторами, в чем ошибка   Вычисление косинуса угла между векторами, в чем ошибка  
0
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
13.06.2012, 12:28
Ну это я не знаю, какую программу ты используешь. Либо неисправленную, либо исправленную неправильно.
Вот эта правильный ответ даёт:
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
#include <iostream>
#include <cmath>
 
using namespace std; 
 
float cosin(float a,float b);
float b1,a1,co,x11,y11,x12,y12,x21,y21,x22,y22; 
 
int main()
{
    setlocale (LC_ALL, "");
    
    cout<<"\n введи координаты векторов x11,y11,x12,y12,x21,y21,x22,y22\n  ";
    cin>>x11>>y11>>x12>>y12>>x21>>y21>>x22>>y22;
    
    a1=sqrt( ((x12-x11)*(x12-x11)) +  ((y12-y11)*(y12-y11)) );
    b1=sqrt( ((x22-x21)*(x22-x21)) +  ((y22-y21)*(y22-y21)) );
    cout<<"длины векторов "<<a1<<" "<<b1;
 
    co=cosin(a1,b1); 
    
    cout<<"\n"; cout<<"косинус угла= "<<co<<"\n";
    return 0;
}
 
float cosin(float b,float a)
{
    float c,X1,Y1,X2,Y2;
    
    X1= x12-x11;
    Y1= y12-y11;
    X2= x22-x21;
    Y2= y22-y21;
    
    c= ( (X1*X2) + (Y1*Y2) ) / ( (fabs(a) * fabs(b)) );
    return c;
}
Добавлено через 4 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Твой же код
С каких это пор этот код мой? Я до последнего сообщения в этой теме кода вообще не выкладывал.
0
13.06.2012, 12:36

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.06.2012, 12:36
Помогаю со студенческими работами здесь

Вычисление векторного произведения и вычисления угла между векторами
написать программу для вычисления векторного произведения и вычисления угла между векторами

Косинус угла между векторами
Косинус угла между векторами

Косинус угла между векторами.
Найти косинус угла между векторами \vec{a}=\left( a_1^{\,},\,a_2\right) и \vec{b}=\left( b_1,\,b_2\right)

Косинус угла между векторами
Доброго времени суток! Не могли бы подсказать в чем я делаю ошибку? Задание такое: Дано ā = (-3;5;10) ē = (2;4;6) Найти:...

Косинус угла между векторами
Помогите! Есть метод класса Anqle //считает величину косинуса угла между векторами template&lt;class Type&gt; double...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Киев стоит - украинская песня
zorxor 28.01.2026
wfWdiRqdTxc О Господи, Вечный, Ты . . . Я помоги, Бесконечный. . . Я прошу Ты. . . Я погибаю, спаси. . . Я прошу Тебя Вечный. . .
Загрузка 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 - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru