Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
5 / 5 / 1
Регистрация: 12.06.2012
Сообщений: 60
1

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

25.04.2013, 14:11. Просмотров 2881. Ответов 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 значение.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.04.2013, 14:11
Ответы с готовыми решениями:

Функция округления
Добрый вечер,дала задание написать свою функцию округления числе,и применить её на своем...

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

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

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

25
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.04.2013, 15:12 2
Цитата Сообщение от Eumi Посмотреть сообщение
Но стоит попытаться использовать массив IndexRhoM, он выдает мне необработанное исключение, при чем ссылается на эту функцию.
Приведите пример вызова.
0
5 / 5 / 1
Регистрация: 12.06.2012
Сообщений: 60
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];
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.04.2013, 15:38 4
Eumi, и где тут RoundingFunction?
0
5 / 5 / 1
Регистрация: 12.06.2012
Сообщений: 60
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];
0
Модератор
Эксперт по электронике
8223 / 6090 / 814
Регистрация: 14.02.2011
Сообщений: 21,147
25.04.2013, 16:02 6
Цитата Сообщение от Eumi Посмотреть сообщение
IndexRhoM,IndexThetaN - динамические массивы
покажи как создаешь
Двумерные?

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


почему так?
C++
1
2
int* IndexRhoM=new int[row*column];
int* IndexThetaN=new int[row*column];
да, двумерные=)
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.04.2013, 16:16 8
Цитата Сообщение от Eumi Посмотреть сообщение
да, двумерные=)
это не двумерные, это имитация двумерности, создавая одномерный определенной длины.
И ещё, хочу обратить Ваше внимание на целочисленное деление, типа 359/360, вы не получите того, что ожидаете.
По изначальной проблеме, мне кажется у Вас много путаницы в коде, учитывая "двумерные" массивы. Поэтому рекомендую привести весь код, который можно было бы собрать. Если хотите чтобы Ваша проблема была решена в кратчайшие сроки
0
5 / 5 / 1
Регистрация: 12.06.2012
Сообщений: 60
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);
    }
}
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.04.2013, 17:04 10
С какими аргументами вызывается HoughTransform() ?
В коде у Вас слишком всё замешано.
А ещё при вызове
C++
1
abs(RoundingVariable)
скорее всего потеряется дробная часть.
0
5 / 5 / 1
Регистрация: 12.06.2012
Сообщений: 60
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 минуты
Попробую тогда обойтись без модуля=) напишу быстренько другую функцию
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.04.2013, 17:35 12
Цитата Сообщение от Eumi Посмотреть сообщение
а разве abs это не обычный модуль?
Зависит от того какая функция используется
Для целых: http://www.cplusplus.com/reference/cstdlib/abs/
Для вещественных: http://www.cplusplus.com/reference/cmath/abs/

Цитата Сообщение от Eumi Посмотреть сообщение
Вот вызов, простите комментарии на английском=)
Значения нужны (цифры), а не комментарии
0
5 / 5 / 1
Регистрация: 12.06.2012
Сообщений: 60
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;
}
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.04.2013, 17:40 14
Цитата Сообщение от Eumi Посмотреть сообщение
он выдает мне необработанное исключение
Что пишет-то, скриншот можно? Или скиньте уже куда-нибудь проект полностью.
0
5 / 5 / 1
Регистрация: 12.06.2012
Сообщений: 60
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 - определяется уже в самой функции, после подсчета
0
Вложения
Тип файла: txt EdgeGradient.txt (53 байт, 5 просмотров)
Тип файла: txt EdgeAngle.txt (76 байт, 5 просмотров)
5 / 5 / 1
Регистрация: 12.06.2012
Сообщений: 60
25.04.2013, 17:46  [ТС] 16
Цитата Сообщение от Tulosba Посмотреть сообщение
Что пишет-то, скриншот можно? Или скиньте уже куда-нибудь проект полностью.
Прикрепила, скрин.Только тут он пишет long, потому что я попыталась изменить тип, но с int тоже самое
0
Миниатюры
Функция округления чисел  
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.04.2013, 17:50 17
Цитата Сообщение от Eumi Посмотреть сообщение
HoughTransformArray =NULL на входе
Уберите-ка в функции HoughTransform() обращение к HoughTransformArray (закомментируйте) и проверьте наличие ошибок.
0
5 / 5 / 1
Регистрация: 12.06.2012
Сообщений: 60
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];
0
:)
Эксперт С++
4763 / 3257 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
25.04.2013, 18:14 19
Для HoughTransformArray выделяете (MaxRhoInt * MaxTheta) элементов, а обращаетесь к элементу с индексом (IndexRhoM[i]*360+IndexThetaN[i]). За диапазон вероятно выходите в цикле. Для проверки мне не хватает EdgeInput.txt
0
5 / 5 / 1
Регистрация: 12.06.2012
Сообщений: 60
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])
Выделяю, и заполняю его нулями, а обращаюсь так, потому что только некоторые элементы меняются, хотя я уже начина сомневаться в своей логике=)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.04.2013, 18:26

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

Функция floor для округления значения до определённого числа знаков дробной части
Всем привет ребята. кто мог бы объяснить где и что неправильно у меня в коде и как это исправить....

Как избежать округления дробных чисел
как сделать что бы не округляло ??? float t; float z,m; using namespace std; void main(void)...

Как избежать округления дробных чисел
не виводит дробь а только целие числа. где проблема ? #include &lt;iostream.h&gt; #include &lt;math.h&gt;...

Каков принцип округления дробных чисел у компьютера/компилятора?
Всем привет. У меня тут такой вопрос для темы: Как именно осуществляется округление дробных...


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

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

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