Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.58/26: Рейтинг темы: голосов - 26, средняя оценка - 4.58
Менчендайзер
0 / 0 / 0
Регистрация: 19.10.2011
Сообщений: 19
#1

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

12.06.2012, 19:34. Просмотров 4780. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.06.2012, 19:34
Ответы с готовыми решениями:

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

Косинус угла между векторами
Помогите! Есть метод класса Anqle //считает величину косинуса угла между...

Программа для определения угла между векторами
Я нашел такую программу внизу, немного исправил ее, но не знаю, что watch...

Написать программу нахождения угла между векторами и плоскостью.
Дан вектор а=(a1, a2, a3) и плоскость, заданная уравнением Ах+Ву+Сz=0. Написать...

Вычисление косинуса
: Всем добрового время суток, я пока только начинаю изучать C++ и у меня...

21
web1720
0 / 0 / 1
Регистрация: 12.06.2012
Сообщений: 10
12.06.2012, 20:23 #2
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
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,050
12.06.2012, 20:29 #3
В строке 24 используются не те координаты (икс вместо игрека).
1
Менчендайзер
0 / 0 / 0
Регистрация: 19.10.2011
Сообщений: 19
12.06.2012, 21:09  [ТС] #4
Огромное СПАСИБО!!!!!

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

Добавлено через 2 минуты
ввёл координаты где получается cos2=1
0
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,050
12.06.2012, 21:28 #5
Цитата Сообщение от Менчендайзер Посмотреть сообщение
ввёл координаты где получается cos2=1
Поподробнее. Что ввёл, что получил?
0
Менчендайзер
0 / 0 / 0
Регистрация: 19.10.2011
Сообщений: 19
13.06.2012, 07:33  [ТС] #6
вот результат
0
Миниатюры
Вычисление косинуса угла между векторами, в чем ошибка  
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,050
13.06.2012, 11:07 #7
Ну и что неправильно? Заданы 2 параллельных вектора. Угол между ними равен нулю. Косинус такого угла равен единице. Что не так?
0
-=ЮрА=-
Заблокирован
Автор FAQ
13.06.2012, 11:24 #8
Господи ты боже мой - ну что за ерись тут написана вообще
Вот это длины векторов
Цитата Сообщение от 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
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,050
13.06.2012, 11:30 #9
-=ЮрА=-, если не в курсе чем вектор отличается от направленного отрезка, то помалкивал бы, а?
1
-=ЮрА=-
Заблокирован
Автор FAQ
13.06.2012, 11:33 #10
Для решения задачи нужно 1-е найти точку О пересечения векторов и если таковая есть (а ведь вектора могут быть параллельными или даже лежать на одной прямой), затем найти одну из длин отмеченную красным. А вот потом уже считать косинус
2
Миниатюры
Вычисление косинуса угла между векторами, в чем ошибка  
-=ЮрА=-
Заблокирован
Автор FAQ
13.06.2012, 11:34 #11
Цитата Сообщение от grizlik78 Посмотреть сообщение
-=ЮрА=-, если не в курсе чем вектор отличается от направленного отрезка, то помалкивал бы, а?
- насмешил меня
grizlik78, я как раз в курсе, а ты демонстрируешь полное незнание того о чём я написал выше, не обижайся я констатирую пока что факты
0
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,050
13.06.2012, 11:39 #12

Не по теме:

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


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

Не по теме:

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

0
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,050
13.06.2012, 12:08 #16
Короче, хватит уже на личности переходить.
Давай в числах пример.
Такие-то координаты надо ввести, такой-то результат должен получится, а отстаиваемый мной метод здесь будет неправильно работать.
0
-=ЮрА=-
13.06.2012, 12:09
  #17

Не по теме:

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

0
-=ЮрА=-
Заблокирован
Автор FAQ
13.06.2012, 12:17 #18
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
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,050
13.06.2012, 12:28 #19
Ну это я не знаю, какую программу ты используешь. Либо неисправленную, либо исправленную неправильно.
Вот эта правильный ответ даёт:
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     Вычисление косинуса угла между векторами, в чем ошибка
  #20

Не по теме:

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

0
13.06.2012, 12:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2012, 12:36
Привет! Вот еще темы с ответами:

Вычисление косинуса через ряд
Здравствуйте =) Пытаюсь посчитать косинус через ряд Тейлора, написал...

Вычисление косинуса разложением в ряд (C++ и Asm)
В общем такая ситуация: Нужно посчитать cos используя разложение в Ряд Вот...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru