Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.70
Менчендайзер
0 / 0 / 0
Регистрация: 19.10.2011
Сообщений: 19
#1

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

12.06.2012, 19:34. Просмотров 4212. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вычисление косинуса угла между векторами, в чем ошибка (C++):

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

Программа для определения угла между векторами - C++
Я нашел такую программу внизу, немного исправил ее, но не знаю, что watch означает и зачем он вообще и все ли тут правильно. Мне...

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

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

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

Вычисление косинуса разложением в ряд (C++ и Asm) - C++
В общем такая ситуация: Нужно посчитать cos используя разложение в Ряд Вот мои наброски #include &lt;stdio.h&gt; #include &lt;math.h&gt; ...

21
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
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
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
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
-=ЮрА=-
Заблокирован
Автор FAQ
13.06.2012, 14:59 #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
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
#include <cmath>
#include <iostream>
using namespace std;
 
//ÔóГ*êöèÿ âû÷èñëÿåò äëèГ*Г*Гі âåêòîðГ* a = {ax, ay}
double vector_module(double ax, double ay);
//ÔóГ*êöèÿ âû÷èñëÿåò Г±ГЄГ*ëÿðГ*îå ïðîèçâåäåГ*ГЁГҐ âåêòîðîâ
//a = {ax, ay}, b = {bx, by}
double scalar_mult  (double ax, double ay, double bx, double by);
 
 
int main()
{
    double x11,y11,x12,y12,x21,y21,x22,y22;
    cout<<"\tENTER VECTOR COORDINATES\n";
    cout<<"VECTOR 1 : \n";
    cout<<"BGN x y : ";cin>>x11>>y11;
    cout<<"END x y : ";cin>>x12>>y12;
    cout<<"VECTOR 2 : \n";
    cout<<"BGN x y : ";cin>>x21>>y21;
    cout<<"END x y : ";cin>>x22>>y22;
    //ГЌГ*õîäèì ìîäóëè (äëèГ*Г» âåêòîðîâ)
    double a = vector_module(x12 - x11, y12 - y11);
    double b = vector_module(x22 - x21, y22 - y21);
    cout<<"VECTOR1 LENGTH : "<<a<<endl;
    cout<<"VECTOR2 LENGTH : "<<b<<endl;
    //ГЌГ*õîäèì Г±ГЄГ*ëÿðГ*îå ïðîèçâåäåГ*ГЁГҐ
    double SCALARMULT = scalar_mult
        (
            x12 - x11, y12 - y11, 
            x22 - x21, y22 - y21
        );
    //SCALARMULT = |a|*|b|*cos(angle)
    //cos(angle) = SCALARMULT/|a|*|b| 
    if(a < pow(10,-11))
        cout<<"VECTOR 1 - ZERO-VECTOR\n";
    else
    if(b < pow(10,-11))
        cout<<"VECTOR 2 - ZERO-VECTOR\n";
    else
        cout<<"COS ANGLE : "<<SCALARMULT/a*b<<endl;
    system("pause");
    return 0;
}
 
double vector_module(double ax, double ay)
{
    return sqrt(pow(ax,2.0) + pow(ay,2.0));
}
 
double scalar_mult(double ax, double ay, double bx, double by)
{
    return ax*bx + ay*by;
}
По поводу этого моего выссказывания
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Ребята без обид вам обоим жирная пара по геометрии и алгебре
да я поторопился с выводом, с толку сбил код который был ну очень похож на вариант теоремы косинусов. В любом случае предлагаемый сейчас код содержит функции вычисления скалярного произведения и модуля вектора как и требовалось в задании.
На счёт всего остального, к алгоритму решил припаять возможность отличать нулевые вектора, которые в общем то могут ввести предложенный алгоритм в посте 19 к некорректному расчёту
0
Миниатюры
Вычисление косинуса угла между векторами, в чем ошибка   Вычисление косинуса угла между векторами, в чем ошибка   Вычисление косинуса угла между векторами, в чем ошибка  

Менчендайзер
0 / 0 / 0
Регистрация: 19.10.2011
Сообщений: 19
19.06.2012, 11:08  [ТС] #22
спасибо!всё сдал я это задание
0
19.06.2012, 11:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.06.2012, 11:08
Привет! Вот еще темы с ответами:

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

Приближенное вычисление корня n-ой степени, в чем ошибка? - C++
#include &lt;cmath&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; main() { float x,x1,e,y,y1,p;y1=1; cout &lt;&lt; &quot;Введите степень точности...

В чем может быть ошибка. Расстояние между вершинами дерева - C++
Входные данные: Первая строка содержит количество вершин в дереве n(1&lt;=n&lt;=500000). Вершины имеют значения от 0 до n-1. В следующих n-1...

Найти угол между векторами - C++
У меня есть координаты конца вектора. Я вроде норм нахожу долготу вектора, но не как не пойму как мне найти угол между ним, что бы он...


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

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

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