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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
#1

Функция округления чисел - C++

25.04.2013, 14:11. Просмотров 1391. Ответов 25
Метки нет (Все метки)

Здравствуйте, подскажите пожалуйста. Написала функцию округления цифр

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void RoundingFunction(double RoundingVariable, int& ResultVariable)
{
    double IntegerPart=0;
    ResultVariable=0;
    if (modf(abs(RoundingVariable),&IntegerPart)<=0.5)
    {
        if (RoundingVariable>0)
            ResultVariable=floor(RoundingVariable);
        else
            ResultVariable=ceil(RoundingVariable);
    }
    else
    {
        if (RoundingVariable>0)
            ResultVariable=ceil(RoundingVariable);
        else
            ResultVariable=floor(RoundingVariable);
    }
}
И вот мне интересно, возможен ли такой вариант, при вызове функции передать туда элемент динамического массива? Например:

C++
1
RoundingFunction(IndexRho,IndexRhoM[i*column+j]);
Когда компилируешь ошибок нет. Но стоит попытаться использовать массив IndexRhoM, он выдает мне необработанное исключение, при чем ссылается на эту функцию. Подскажите. Можно ли так сделать? Кстати, он выдает мне warning в этой функции так как по сути я присваиваю целому значению double значение.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2013, 14:11     Функция округления чисел
Посмотрите здесь:

Функция округления double - C++
Как в С++ округлить double до int? С помощью какой функции?

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

Как избежать округления дробных чисел - C++
не виводит дробь а только целие числа. где проблема ? #include &lt;iostream.h&gt; #include &lt;math.h&gt; int mat(double x,double y){ ...

Как избежать округления дробных чисел - C++
как сделать что бы не округляло ??? float t; float z,m; using namespace std; void main(void) { m=-pow(5,2)/2;

Чудеса округления - C++
Не могу посчитать i-ый член по формуле разности Ньютона (см. прикреплённый файл). Из-за округления я не могу получить члены после j...

Метод округления числа - C++
Метод округления числа введонного с клавиатуры. Например вводим 2,5 , а выводит 3 ;

Каковая точность округления? - C++
Какова точность округления у таких функций, как round/ceil/floor? Сколько раз я могу просуммировать число с погрешностью (имеется ввиду,...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.04.2013, 15:12     Функция округления чисел #2
Цитата Сообщение от Eumi Посмотреть сообщение
Но стоит попытаться использовать массив IndexRhoM, он выдает мне необработанное исключение, при чем ссылается на эту функцию.
Приведите пример вызова.
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
25.04.2013, 15:29  [ТС]     Функция округления чисел #3
Цитата Сообщение от Tulosba Посмотреть сообщение
Приведите пример вызова.
C++
1
2
for (i=0; i<n; i++)
        HoughTransformArray[IndexRhoM[i]*360+IndexThetaN[i]]=HoughTransformArray[IndexRhoM[i]*360+IndexThetaN[i]]+Gradient[i];
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.04.2013, 15:38     Функция округления чисел #4
Eumi, и где тут RoundingFunction?
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
25.04.2013, 15:59  [ТС]     Функция округления чисел #5
Цитата Сообщение от Tulosba Посмотреть сообщение
Eumi, и где тут RoundingFunction?
я показала на первом посте вызов. Вот еще раз и поподробнее. IndexRhoM,IndexThetaN - динамические массивы
C++
1
2
3
4
5
6
7
8
9
10
11
for (i=0; i<row; i++)
        for (j=0;j<column;j++)
        {
            double IndexRho=0;
            double IndexTheta=0;
            IndexRho=2*MaxRho-(MaxRho-RhoPolarCoordinate[i*column+j])*(MaxRho-1)/(2*MaxRho);
            IndexTheta=360-((180-ThetaPolarCoordinate[i*column+j])*359/360);
            RoundingFunction(IndexRho,IndexRhoM[i*column+j]);
            RoundingFunction(IndexTheta,IndexThetaN[i*column+j]);
            
        }
все ок, ошибок нет. Но стоит написать эти строчки как сразу необработанное исключение, указывая на функцию округления

C++
1
2
    for (i=0; i<n; i++) 
                 HoughTransformArray[IndexRhoM[i]*360+IndexThetaN[i]]=HoughTransformArray[IndexRhoM[i]*360+IndexThetaN[i]]+Gradient[i];
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,728
25.04.2013, 16:02     Функция округления чисел #6
Цитата Сообщение от Eumi Посмотреть сообщение
IndexRhoM,IndexThetaN - динамические массивы
покажи как создаешь
Двумерные?

Цитата Сообщение от Eumi Посмотреть сообщение
[i*column+j]
почему так?
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
25.04.2013, 16:12  [ТС]     Функция округления чисел #7
Цитата Сообщение от ValeryS Посмотреть сообщение
покажи как создаешь
Двумерные?


почему так?
C++
1
2
int* IndexRhoM=new int[row*column];
int* IndexThetaN=new int[row*column];
да, двумерные=)
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.04.2013, 16:16     Функция округления чисел #8
Цитата Сообщение от Eumi Посмотреть сообщение
да, двумерные=)
это не двумерные, это имитация двумерности, создавая одномерный определенной длины.
И ещё, хочу обратить Ваше внимание на целочисленное деление, типа 359/360, вы не получите того, что ожидаете.
По изначальной проблеме, мне кажется у Вас много путаницы в коде, учитывая "двумерные" массивы. Поэтому рекомендую привести весь код, который можно было бы собрать. Если хотите чтобы Ваша проблема была решена в кратчайшие сроки
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
25.04.2013, 16:28  [ТС]     Функция округления чисел #9
Цитата Сообщение от Tulosba Посмотреть сообщение
это не двумерные, это имитация двумерности, создавая одномерный определенной длины.
И ещё, хочу обратить Ваше внимание на целочисленное деление, типа 359/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
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
void HoughTransform(double* Gradient, double* EdgeAngleArray, double*& HoughTransformArray, int row, int column, int MaxTheta, int& MaxRhoInt)
{
    int i=0;
    int j=0;
    double* AnglePhi;//Phi=arctg(y/x)
    double* ThetaPolarCoordinate;
    double* RhoPolarCoordinate;
    AnglePhi=new double[row*column];
    ThetaPolarCoordinate=new double[row*column];
    RhoPolarCoordinate=new double[row*column];
    for (i=0; i<row; i++)//working with edge gradient angle
        for (j=0;j<column;j++)
        {
            if ((EdgeAngleArray[i*column+j]<90)&&(EdgeAngleArray[i*column+j]>=-90))
                EdgeAngleArray[i*column+j]=EdgeAngleArray[i*column+j]+90;
            else if ((EdgeAngleArray[i*column+j]>=90)&&(EdgeAngleArray[i*column+j]<180))
                EdgeAngleArray[i*column+j]=EdgeAngleArray[i*column+j]-90;
            else if ((EdgeAngleArray[i*column+j]>=-180)&&(EdgeAngleArray[i*column+j]<-90))
                EdgeAngleArray[i*column+j]=EdgeAngleArray[i*column+j]+270;
 
            if (j==0)
                AnglePhi[i*column+j]=90;
            else
                AnglePhi[i*column+j]=atan(i/j)*180/PI;//arctang(y/x)
 
            if (EdgeAngleArray[i*column+j]<AnglePhi[i*column+j])
                ThetaPolarCoordinate[i*column+j]=EdgeAngleArray[i*column+j]+90;
            else
                ThetaPolarCoordinate[i*column+j]=EdgeAngleArray[i*column+j]-90;
            RhoPolarCoordinate[i*column+j]=j*cos(ThetaPolarCoordinate[i*column+j])+i*sin(ThetaPolarCoordinate[i*column+j]);//rho=x*cos(theta)+y*sin(theta)
        }
    i=0;
    j=0;
    double MaxRho=RhoPolarCoordinate[0];//for finding max rho
    for (i=0; i<row; i++)
        for (j=0;j<column;j++)
        {
            if (RhoPolarCoordinate[i*column+j]>MaxRho)
                MaxRho=RhoPolarCoordinate[i*column+j];
        }
    RoundingFunction(MaxRho,MaxRhoInt);
    AlocatePicture(HoughTransformArray, MaxRhoInt, MaxTheta);
    i=0;
    j=0;
    int* IndexRhoM=new int[row*column];
    int* IndexThetaN=new int[row*column];
    for (i=0; i<row; i++)
        for (j=0;j<column;j++)
        {
            double IndexRho=0;
            double IndexTheta=0;
            IndexRho=2*MaxRho-(MaxRho-RhoPolarCoordinate[i*column+j])*(MaxRho-1)/(2*MaxRho);
            IndexTheta=360-((180-ThetaPolarCoordinate[i*column+j])*359/360);
            RoundingFunction(IndexRho,IndexRhoM[i*column+j]);
            RoundingFunction(IndexTheta,IndexThetaN[i*column+j]);
            
        }
    i=0;
    j=0;
    for (i=0;i<MaxRhoInt;i++)
        for (j=0;j<MaxTheta;j++)
                HoughTransformArray[i*360+j]=0;
    int n=column*row;
    i=0;
    j=0;
    for (i=0; i<n; i++)
            HoughTransformArray[IndexRhoM[i]*360+IndexThetaN[i]]=HoughTransformArray[IndexRhoM[i]*360+IndexThetaN[i]]+Gradient[i];
    
    delete []AnglePhi;
    delete []ThetaPolarCoordinate;
    delete []RhoPolarCoordinate;
    delete []IndexRhoM;
    delete []IndexThetaN;
}
 
void RoundingFunction(double RoundingVariable, int& ResultVariable)
{
    double IntegerPart=0;
    ResultVariable=0;
    if (modf(abs(RoundingVariable),&IntegerPart)<=0.5)
    {
        if (RoundingVariable>0)
            ResultVariable=floor(RoundingVariable);
        else
            ResultVariable=ceil(RoundingVariable);
    }
    else
    {
        if (RoundingVariable>0)
            ResultVariable=ceil(RoundingVariable);
        else
            ResultVariable=floor(RoundingVariable);
    }
}
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.04.2013, 17:04     Функция округления чисел #10
С какими аргументами вызывается HoughTransform() ?
В коде у Вас слишком всё замешано.
А ещё при вызове
C++
1
abs(RoundingVariable)
скорее всего потеряется дробная часть.
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
25.04.2013, 17:24  [ТС]     Функция округления чисел #11
Цитата Сообщение от Tulosba Посмотреть сообщение
С какими аргументами вызывается HoughTransform() ?
В коде у Вас слишком всё замешано.
А ещё при вызове
C++
1
abs(RoundingVariable)
скорее всего потеряется дробная часть.
а разве abs это не обычный модуль? то есть по сути просто должен знак убирать? Вот вызов, простите комментарии на английском=)

C++
1
2
3
4
5
6
7
8
    /*
    ArrayGradient - result after gradient method - динамический массив
    ArrayEdgeAngle - edge angles after gradient method - динамический массив
    HoughTransformArray - resulting array after Hought transform - результирующий динамический массив
    RowGradient, ColumnGradient - numbers of  rowas and columns in input array - размеры динамического массива, количество строк и столбцов
    MaxTheta = 360 degrees is constant,MaxRhoInt = 0 - numbers of rows in resulting array define in the function - размеры результирующего массива, MaxRhoInt - определяется в функции
    */
    HoughTransform(ArrayGradient,ArrayEdgeAngle, HoughTransformArray, RowGradient, ColumnGradient, MaxTheta,MaxRhoInt);
Добавлено через 2 минуты
Попробую тогда обойтись без модуля=) напишу быстренько другую функцию
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.04.2013, 17:35     Функция округления чисел #12
Цитата Сообщение от Eumi Посмотреть сообщение
а разве abs это не обычный модуль?
Зависит от того какая функция используется
Для целых: http://www.cplusplus.com/reference/cstdlib/abs/
Для вещественных: http://www.cplusplus.com/reference/cmath/abs/

Цитата Сообщение от Eumi Посмотреть сообщение
Вот вызов, простите комментарии на английском=)
Значения нужны (цифры), а не комментарии
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
25.04.2013, 17:36  [ТС]     Функция округления чисел #13
Сделала вот так вот, на одно исключение меньше. Но все равно есть=(
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void RoundingFunction(double RoundingVariable, long& ResultVariable)
{
    double IntegerPart=0;
    ResultVariable=0;
    if (RoundingVariable>0)
    {
        if (modf(RoundingVariable,&IntegerPart)<=0.5)
            ResultVariable=floor(RoundingVariable);
        else
            ResultVariable=ceil(RoundingVariable);
    }
    else if (RoundingVariable<0)
    {
        if (modf(RoundingVariable,&IntegerPart)<=-0.5)
            ResultVariable=floor(RoundingVariable);
        else
            ResultVariable=ceil(RoundingVariable);
    }
    else
        ResultVariable=0;
}
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.04.2013, 17:40     Функция округления чисел #14
Цитата Сообщение от Eumi Посмотреть сообщение
он выдает мне необработанное исключение
Что пишет-то, скриншот можно? Или скиньте уже куда-нибудь проект полностью.
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
25.04.2013, 17:43  [ТС]     Функция округления чисел #15
Цитата Сообщение от Tulosba Посмотреть сообщение
Зависит от того какая функция используется
Для целых: http://www.cplusplus.com/reference/cstdlib/abs/
Для вещественных: http://www.cplusplus.com/reference/cmath/abs/


Значения нужны (цифры), а не комментарии
Я прикрепила файлы, программа считывает матрицы с них, определяет размеры, а потом передает все данные в функцию.

ArrayGradient - EdgeGradient.txt
ArrayEdgeAngle - EdgeAngle.txt
HoughTransformArray =NULL на входе
RowGradient, ColumnGradient = 5 - зависит от матрицы в текстовом файле
MaxTheta = 360 - остается неизменным
MaxRhoInt = 0 - определяется уже в самой функции, после подсчета
Вложения
Тип файла: txt EdgeGradient.txt (53 байт, 4 просмотров)
Тип файла: txt EdgeAngle.txt (76 байт, 4 просмотров)
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
25.04.2013, 17:46  [ТС]     Функция округления чисел #16
Цитата Сообщение от Tulosba Посмотреть сообщение
Что пишет-то, скриншот можно? Или скиньте уже куда-нибудь проект полностью.
Прикрепила, скрин.Только тут он пишет long, потому что я попыталась изменить тип, но с int тоже самое
Миниатюры
Функция округления чисел  
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.04.2013, 17:50     Функция округления чисел #17
Цитата Сообщение от Eumi Посмотреть сообщение
HoughTransformArray =NULL на входе
Уберите-ка в функции HoughTransform() обращение к HoughTransformArray (закомментируйте) и проверьте наличие ошибок.
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
25.04.2013, 17:55  [ТС]     Функция округления чисел #18
Цитата Сообщение от Tulosba Посмотреть сообщение
Что пишет-то, скриншот можно? Или скиньте уже куда-нибудь проект полностью.
Вот весь проект, но он и правда очень большой, боюсь вас запутать еще больше.

Кликните здесь для просмотра всего текста
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <vector>
#include <math.h>
 
#define PI 3.14159265
 
using namespace std;
 
void ReadData(const char*, vector<double>&, int&, int&);
void ConvertVectorToDoubleArray(vector<double>, double*&, int, int);
int EdgeDetection(double*, double*&, double*&, int, int);
void WriteData(const char*, double*, int, int);
void AlocatePicture(double*&, int, int);
void DelocatingPicture(double*&);
void HoughTransform(double*, double*, double*&, int, int, int, int&);
void RoundingFunction(double, int&);
 
 
int main()
{
    /*The orthogonal egde detection method*/
    double* Gradient;//resulting array
    vector<double> VectorArray;
    double* tab;//input array
    double* AngQ;//An edge gradient angle array
    
    int row=0;
    int column=0;
    tab=NULL;
    Gradient=NULL;
    AngQ=NULL;
        
    ReadData("EdgeInput.txt", VectorArray, row, column);//reading a data and define sizes of matrix
    AlocatePicture(tab, row, column);// alocate a memory for the input array
    ConvertVectorToDoubleArray(VectorArray, tab, row, column);
    AlocatePicture(Gradient, row, column);//alocate a memory for the result array
    AlocatePicture(AngQ, row, column);//alocate memory for an edge gradient angle array
    EdgeDetection(tab, Gradient, AngQ, row, column);
    DelocatingPicture(tab);// deleting the input array
    WriteData("EdgeResult.txt", Gradient, row, column); 
    WriteData("EdgeAngle.txt", AngQ, row, column);
    DelocatingPicture(Gradient);// Delocating the memory for the result array
    DelocatingPicture(AngQ);//deleting the memory for the angle array
 
    /*The Hough Transform*/
    vector<double> VectorArrayGradient;
    vector<double> VectorArrayAngle;
    double* ArrayGradient;// input data(after appling gradient method)
    double* ArrayEdgeAngle;// edge angle array 
    double* HoughTransformArray;//resulting array
 
    int RowGradient=0;// Numbers of rows and columns in EdgeResult file
    int ColumnGradient=0;
    int RowAngle=0;// Numbers of rows and columns in EdgeAngle file
    int ColumnAngle=0;
    int MaxRhoInt=0;
    int MaxTheta=360;
    HoughTransformArray=NULL;
    ArrayGradient=NULL;
    ArrayEdgeAngle=NULL;
 
    ReadData("EdgeResult.txt", VectorArrayGradient, RowGradient, ColumnGradient);// reading input data from Gradient method and define numbers of rows and columns
    ReadData("EdgeAngle.txt", VectorArrayAngle, RowAngle, ColumnAngle);// reading input edge angles and define numbers of rows and columns
    AlocatePicture(ArrayGradient, RowGradient, ColumnGradient);//alocate memory for the gradient array
    AlocatePicture(ArrayEdgeAngle, RowAngle, ColumnAngle);//alocate memory for the angles array
    ConvertVectorToDoubleArray(VectorArrayGradient, ArrayGradient, RowGradient, ColumnGradient); //should be RowGradient = RowAngle, ColumnGradient=ColumnAngle, later in the programm used just one type
    ConvertVectorToDoubleArray(VectorArrayAngle, ArrayEdgeAngle, RowAngle, ColumnAngle);
    /*
    ArrayGradient - result after gradient method
    ArrayEdgeAngle - edge angles after gradient method
    HoughTransformArray - resulting array after Hought transform
    RowGradient, ColumnGradient - numbers of  rowas and columns in input array
    MaxTheta = 360 degrees is constant,MaxRhoInt = 0 - numbers of rows in resulting array define in the function
    */
    HoughTransform(ArrayGradient,ArrayEdgeAngle, HoughTransformArray, RowGradient, ColumnGradient, MaxTheta,MaxRhoInt);
    WriteData("HoughTransformResult.txt", HoughTransformArray, MaxRhoInt, MaxTheta);
    DelocatingPicture(HoughTransformArray);
}
 
/*Reading the file and define sizes of array*/
 
void ReadData(const char* filename, vector<double> &OutputVector, int& row, int& column)
{
    ifstream EdgeInputData(filename);
    if (!EdgeInputData) 
        cerr << "Error! Can't open the input file.\n";
    double InterveningVariable=0;
    while (!EdgeInputData.eof())
    {
        EdgeInputData>>InterveningVariable;
        OutputVector.push_back(InterveningVariable);
        
        if (EdgeInputData.peek() =='\n' || EdgeInputData.peek() == EOF)
            row++;
    }
    column = OutputVector.size()/row;
    
    EdgeInputData.close();
}
 
void AlocatePicture(double* &img, int row, int column)
{
    if (img!=NULL)
        delete []img;
    else
        img=new double[row*column];
}
 
void DelocatingPicture(double* &img)
{
    if (img==NULL)
        return;
    else
    {
        delete []img;
        img=NULL;
    }
}
 
/*Convert vector array to array */ 
void ConvertVectorToDoubleArray(vector<double> InputVector, double* &OutputArray, int row, int column)
{
//  OutputArray=new double[row*column];
    int i=0;
    int j=0;
    for (i=0; i<row; i++)
        for (j=0; j<column; j++)
            OutputArray[i*column + j] = InputVector[i*column + j];
}
 
/* Method of gradient*/
int EdgeDetection(double* InputArray, double* &G, double*& AngleArray, int row, int column)
{
    int i=0;
    int j=0;
    double *GC;
    GC=new double[row*column];
    for (i=0; i<row; i++)
        for(j=0; j<column; j++)
        {
            if (j==0)
                GC[i*column+j] = InputArray[i*column+j] - InputArray[i*column+j+1];//The boundary
            else 
                GC[i*column+j] = InputArray[i*column+j] - InputArray[i*column+j-1];
        }
 
    /*Forming array inlude raw gradients*/
    double *GR;
    GR=new double[row*column];
    for (j=0; j<column; j++)
        for(i=0; i<row; i++)
        {
            if (i==0)
                GR[i*column+j] = InputArray[i*column+j] - InputArray[(i+1)*column+j];//The boundary
            else
                GR[i*column+j] = InputArray[i*column+j] - InputArray[(i-1)*column+j];//The row gradient
                
        }
    /*The edge gradient and angles*/
    for (i=0; i<row; i++)
        for(j=0; j<column; j++)
        {
            G[i*column+j] = abs(GC[i*column + j]) + abs(GR[i*column + j]);//resulting gradient
            if (GR[i*column + j]==0)
                AngleArray[i*column+j]=90;
            else
                AngleArray[i*column+j]=atan(GC[i*column + j]/GR[i*column + j])*180/PI;//angle in degrees
        }
    
    delete [] GR;
    delete [] GC;
    return 0;
}
 
 /*write data in output file*/
void WriteData(const char* filename, double* matrix, int row, int column)
{
    ofstream EdgeResultFile(filename); //Open a file for output
    if (!EdgeResultFile) 
        cerr << "Error! Can't open the output file.\n";
    int i=0;
    int j=0;
    for (i=0; i<row; i++)
    {
        for(j=0; j<column; j++)
        {
            EdgeResultFile << matrix[i*column+j];
            if (j < column - 1) EdgeResultFile << " ";
        }
        if (i < row - 1) EdgeResultFile << "\n";
    }
    EdgeResultFile.close(); 
}
 
void HoughTransform(double* Gradient, double* EdgeAngleArray, double*& HoughTransformArray, int row, int column, int MaxTheta, int& MaxRhoInt)
{
    int i=0;
    int j=0;
    double* AnglePhi;//Phi=arctg(y/x)
    double* ThetaPolarCoordinate;
    double* RhoPolarCoordinate;
    AnglePhi=new double[row*column];
    ThetaPolarCoordinate=new double[row*column];
    RhoPolarCoordinate=new double[row*column];
    for (i=0; i<row; i++)//working with edge gradient angle
        for (j=0;j<column;j++)
        {
            if ((EdgeAngleArray[i*column+j]<90)&&(EdgeAngleArray[i*column+j]>=-90))
                EdgeAngleArray[i*column+j]=EdgeAngleArray[i*column+j]+90;
            else if ((EdgeAngleArray[i*column+j]>=90)&&(EdgeAngleArray[i*column+j]<180))
                EdgeAngleArray[i*column+j]=EdgeAngleArray[i*column+j]-90;
            else if ((EdgeAngleArray[i*column+j]>=-180)&&(EdgeAngleArray[i*column+j]<-90))
                EdgeAngleArray[i*column+j]=EdgeAngleArray[i*column+j]+270;
 
            if (j==0)
                AnglePhi[i*column+j]=90;
            else
                AnglePhi[i*column+j]=atan(i/j)*180/PI;//arctang(y/x)
 
            if (EdgeAngleArray[i*column+j]<AnglePhi[i*column+j])
                ThetaPolarCoordinate[i*column+j]=EdgeAngleArray[i*column+j]+90;
            else
                ThetaPolarCoordinate[i*column+j]=EdgeAngleArray[i*column+j]-90;
            RhoPolarCoordinate[i*column+j]=j*cos(ThetaPolarCoordinate[i*column+j])+i*sin(ThetaPolarCoordinate[i*column+j]);//rho=x*cos(theta)+y*sin(theta)
        }
    i=0;
    j=0;
    double MaxRho=RhoPolarCoordinate[0];//for finding max rho
    for (i=0; i<row; i++)
        for (j=0;j<column;j++)
        {
            if (RhoPolarCoordinate[i*column+j]>MaxRho)
                MaxRho=RhoPolarCoordinate[i*column+j];
        }
    RoundingFunction(MaxRho,MaxRhoInt);
    AlocatePicture(HoughTransformArray, MaxRhoInt, MaxTheta);
    i=0;
    j=0;
    int* IndexRhoM=new int[row*column];
    int* IndexThetaN=new int[row*column];
    for (i=0; i<row; i++)
        for (j=0;j<column;j++)
        {
            double IndexRho=0;
            double IndexTheta=0;
            IndexRho=2*MaxRho-(MaxRho-RhoPolarCoordinate[i*column+j])*(MaxRho-1)/(2*MaxRho);
            IndexTheta=360-((180-ThetaPolarCoordinate[i*column+j])*359/360);
            RoundingFunction(IndexRho,IndexRhoM[i*column+j]);
            RoundingFunction(IndexTheta,IndexThetaN[i*column+j]);
            
        }
    i=0;
    j=0;
    for (i=0;i<MaxRhoInt;i++)
        for (j=0;j<MaxTheta;j++)
                HoughTransformArray[i*360+j]=0;
    int n=column*row;
    i=0;
    j=0;
    for (i=0; i<n; i++)
            HoughTransformArray[IndexRhoM[i]*360+IndexThetaN[i]]=HoughTransformArray[IndexRhoM[i]*360+IndexThetaN[i]]+Gradient[i];
    
    delete []AnglePhi;
    delete []ThetaPolarCoordinate;
    delete []RhoPolarCoordinate;
    delete []IndexRhoM;
    delete []IndexThetaN;
}
 
/*void RoundingFunction(double RoundingVariable, int& ResultVariable)
{
    double IntegerPart=0;
    ResultVariable=0;
    if (modf(abs(RoundingVariable),&IntegerPart)<=0.5)
    {
        if (RoundingVariable>0)
            ResultVariable=floor(RoundingVariable);
        else
            ResultVariable=ceil(RoundingVariable);
    }
    else
    {
        if (RoundingVariable>0)
            ResultVariable=ceil(RoundingVariable);
        else
            ResultVariable=floor(RoundingVariable);
    }
}*/
 
void RoundingFunction(double RoundingVariable, int& ResultVariable)
{
    double IntegerPart=0;
    ResultVariable=0;
    if (RoundingVariable>0)
    {
        if (modf(RoundingVariable,&IntegerPart)<=0.5)
            ResultVariable=floor(RoundingVariable);
        else
            ResultVariable=ceil(RoundingVariable);
    }
    else if (RoundingVariable<0)
    {
        if (modf(RoundingVariable,&IntegerPart)<=-0.5)
            ResultVariable=floor(RoundingVariable);
        else
            ResultVariable=ceil(RoundingVariable);
    }
    else
        ResultVariable=0;
}


Добавлено через 1 минуту
Цитата Сообщение от Tulosba Посмотреть сообщение
Уберите-ка в функции HoughTransform() обращение к HoughTransformArray (закомментируйте) и проверьте наличие ошибок.
Я уже упоминала, что без этой строчки он не выдает ошибок

C++
1
2
for (i=0; i<n; i++)
    HoughTransformArray[IndexRhoM[i]*360+IndexThetaN[i]]=HoughTransformArray[IndexRhoM[i]*360+IndexThetaN[i]]+Gradient[i];
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.04.2013, 18:14     Функция округления чисел #19
Для HoughTransformArray выделяете (MaxRhoInt * MaxTheta) элементов, а обращаетесь к элементу с индексом (IndexRhoM[i]*360+IndexThetaN[i]). За диапазон вероятно выходите в цикле. Для проверки мне не хватает EdgeInput.txt
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2013, 18:26     Функция округления чисел
Еще ссылки по теме:

Как убрать округления - C++
Вообщем есть набор чисел. Например: visual studio округляет число типа double - вместо 22995,56 пишет 22995,6. Как заставить её забыть...

Как избавиться от округления - C++
Доброго времени суток. У меня следующая проблема. pp = 0.1534886 + 151.5235 - 0.15668835467; pp имеет тип double, но в качестве...

Ошибка округления - Сумма с синусом - C++
Добрый день! Помогите пожалуйста понять в чем причина. При проверке кода на моем компьютере при вводе числа 1000, выдает корректный...

как избавиться от округления float - C++
#include &lt;iostream&gt; using std:: cin; using std:: cout; using std:: endl; int main() { cout &lt;&lt; &quot;123.008 + 0.0008 = &quot; &lt;&lt;...

Написать программу округления числа - C++
Напишите программу, в которой с помощью round() округляется значение типа double. Для разложения числа на целую и дробную часть...


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

Или воспользуйтесь поиском по форуму:
Eumi
5 / 5 / 0
Регистрация: 12.06.2012
Сообщений: 58
25.04.2013, 18:26  [ТС]     Функция округления чисел #20
Цитата Сообщение от Tulosba Посмотреть сообщение
Для HoughTransformArray выделяете (MaxRhoInt * MaxTheta) элементов, а обращаетесь к элементу с индексом (IndexRhoM[i]*360+IndexThetaN[i]). За диапазон вероятно выходите в цикле. Для проверки мне не хватает EdgeInput.txt
Создайте файл с таким массивом. Мне почему то не позволяет прикрепить файл, говорит что уже выкладывала=)

0 0 0 0 0
0 0 0 0 0
0 0 1 1 1
0 0 1 1 1
0 0 1 1 1

Добавлено через 1 минуту
Цитата Сообщение от Eumi Посмотреть сообщение
ля HoughTransformArray выделяете (MaxRhoInt * MaxTheta) элементов, а обращаетесь к элементу с индексом (IndexRhoM[i]*360+IndexThetaN[i])
Выделяю, и заполняю его нулями, а обращаюсь так, потому что только некоторые элементы меняются, хотя я уже начина сомневаться в своей логике=)
Yandex
Объявления
25.04.2013, 18:26     Функция округления чисел
Ответ Создать тему
Опции темы

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