Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
A
alta
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
5
Issues
5
List
Boards
Labels
Service Desk
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
alta
alta
Commits
b3d65baf
Commit
b3d65baf
authored
Apr 02, 2015
by
Ludovic Courtès
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Move the default input/output formats to data_storage.{cpp,h}.
parent
a4f8f6e7
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
263 additions
and
228 deletions
+263
-228
sources/core/SConscript
sources/core/SConscript
+1
-0
sources/core/data.cpp
sources/core/data.cpp
+1
-16
sources/core/data_storage.cpp
sources/core/data_storage.cpp
+243
-0
sources/core/data_storage.h
sources/core/data_storage.h
+17
-0
sources/core/vertical_segment.cpp
sources/core/vertical_segment.cpp
+1
-212
No files found.
sources/core/SConscript
View file @
b3d65baf
...
@@ -6,6 +6,7 @@ Import('env', 'ALTA_LIBS')
...
@@ -6,6 +6,7 @@ Import('env', 'ALTA_LIBS')
# Library sources
# Library sources
sources
=
[
'common.cpp'
,
sources
=
[
'common.cpp'
,
'data.cpp'
,
'data.cpp'
,
'data_storage.cpp'
,
'function.cpp'
,
'function.cpp'
,
'params.cpp'
,
'params.cpp'
,
'plugins_manager.cpp'
,
'plugins_manager.cpp'
,
...
...
sources/core/data.cpp
View file @
b3d65baf
...
@@ -10,22 +10,7 @@
...
@@ -10,22 +10,7 @@
#include <iostream>
#include <iostream>
#include "data.h"
#include "data.h"
#include "data_storage.h"
static
void
save_data_as_text
(
std
::
ostream
&
out
,
const
data
&
data
)
{
out
<<
"#DIM "
<<
data
.
dimX
()
<<
" "
<<
data
.
dimY
()
<<
std
::
endl
;
out
<<
"#PARAM_IN "
<<
params
::
get_name
(
data
.
input_parametrization
())
<<
std
::
endl
;
out
<<
"#PARAM_OUT "
<<
params
::
get_name
(
data
.
output_parametrization
())
<<
std
::
endl
;
for
(
int
i
=
0
;
i
<
data
.
size
();
++
i
)
{
vec
x
=
data
.
get
(
i
);
for
(
int
j
=
0
;
j
<
data
.
dimX
()
+
data
.
dimY
();
++
j
)
{
out
<<
x
[
j
]
<<
"
\t
"
;
}
out
<<
std
::
endl
;
}
}
void
data
::
save
(
const
std
::
string
&
filename
)
const
void
data
::
save
(
const
std
::
string
&
filename
)
const
{
{
...
...
sources/core/data_storage.cpp
0 → 100644
View file @
b3d65baf
/* ALTA --- Analysis of Bidirectional Reflectance Distribution Functions
Copyright (C) 2013, 2014, 2015 Inria
This file is part of ALTA.
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "data.h"
#include "data_storage.h"
#include "vertical_segment.h"
#include <iostream>
#include <limits>
void
vertical_segment
::
load_data_from_text
(
std
::
istream
&
input
,
vertical_segment
&
result
,
const
arguments
&
args
)
{
vec
min
,
max
;
vec
ymin
,
ymax
;
result
.
_nX
=
0
;
result
.
_nY
=
0
;
std
::
vector
<
int
>
vs
;
int
current_vs
=
0
;
while
(
input
.
good
())
{
std
::
string
line
;
std
::
getline
(
input
,
line
)
;
std
::
stringstream
linestream
(
line
)
;
// Discard incorrect lines
if
(
linestream
.
peek
()
==
'#'
)
{
linestream
.
ignore
(
1
)
;
std
::
string
comment
;
linestream
>>
comment
;
if
(
comment
==
std
::
string
(
"DIM"
))
{
linestream
>>
result
.
_nX
>>
result
.
_nY
;
vs
.
reserve
(
result
.
dimY
())
;
for
(
int
k
=
0
;
k
<
result
.
dimY
();
++
k
)
{
vs
[
k
]
=
0
;
}
result
.
_min
.
resize
(
result
.
dimX
())
;
result
.
_max
.
resize
(
result
.
dimX
())
;
min
=
args
.
get_vec
(
"min"
,
result
.
_nX
,
-
std
::
numeric_limits
<
float
>::
max
())
;
max
=
args
.
get_vec
(
"max"
,
result
.
_nX
,
std
::
numeric_limits
<
float
>::
max
())
;
#ifdef DEBUG
std
::
cout
<<
"<<DEBUG>> data will remove outside of "
<<
min
<<
" -> "
<<
max
<<
" x-interval"
<<
std
::
endl
;
#endif
ymin
=
args
.
get_vec
(
"ymin"
,
result
.
_nY
,
-
std
::
numeric_limits
<
float
>::
max
())
;
ymax
=
args
.
get_vec
(
"ymax"
,
result
.
_nY
,
std
::
numeric_limits
<
float
>::
max
())
;
#ifdef DEBUG
std
::
cout
<<
"<<DEBUG>> data will remove outside of "
<<
ymin
<<
" -> "
<<
ymax
<<
" y-interval"
<<
std
::
endl
;
#endif
for
(
int
k
=
0
;
k
<
result
.
dimX
();
++
k
)
{
result
.
_min
[
k
]
=
std
::
numeric_limits
<
double
>::
max
()
;
result
.
_max
[
k
]
=
-
std
::
numeric_limits
<
double
>::
max
()
;
}
}
else
if
(
comment
==
std
::
string
(
"VS"
))
{
int
t
;
linestream
>>
t
;
vs
[
current_vs
]
=
t
;
++
current_vs
;
}
else
if
(
comment
==
std
::
string
(
"PARAM_IN"
))
{
std
::
string
param
;
linestream
>>
param
;
result
.
_in_param
=
params
::
parse_input
(
param
);
}
else
if
(
comment
==
std
::
string
(
"PARAM_OUT"
))
{
std
::
string
param
;
linestream
>>
param
;
result
.
_out_param
=
params
::
parse_output
(
param
);
}
continue
;
}
else
if
(
line
.
empty
())
{
continue
;
}
else
{
// Read the data point x and y coordinates
vec
v
=
vec
::
Zero
(
result
.
dimX
()
+
3
*
result
.
dimY
())
;
for
(
int
i
=
0
;
i
<
result
.
dimX
()
+
result
.
dimY
();
++
i
)
{
linestream
>>
v
[
i
]
;
}
// If data is not in the interval of fit
bool
is_in
=
true
;
for
(
int
i
=
0
;
i
<
result
.
dimX
();
++
i
)
{
if
(
v
[
i
]
<
min
[
i
]
||
v
[
i
]
>
max
[
i
])
{
is_in
=
false
;
}
}
for
(
int
i
=
0
;
i
<
result
.
dimY
();
++
i
)
{
if
(
v
[
result
.
dimX
()
+
i
]
<
ymin
[
i
]
||
v
[
result
.
dimX
()
+
i
]
>
ymax
[
i
])
{
is_in
=
false
;
}
}
if
(
!
is_in
)
{
continue
;
}
// /*
// Correction of the data by 1/cosine(theta_L)
double
factor
=
1.0
;
if
(
args
.
is_defined
(
"data-correct-cosine"
))
{
double
cart
[
6
];
params
::
convert
(
&
v
[
0
],
result
.
input_parametrization
(),
params
::
CARTESIAN
,
cart
);
if
(
cart
[
5
]
>
0.0
&&
cart
[
2
]
>
0.0
)
{
factor
=
1.0
/
cart
[
5
]
*
cart
[
2
];
for
(
int
i
=
0
;
i
<
result
.
dimY
();
++
i
)
{
v
[
i
+
result
.
dimX
()]
/=
factor
;
}
}
else
{
continue
;
}
}
// End of correction
// */
// Check if the data containt a vertical segment around the mean
// value.
for
(
int
i
=
0
;
i
<
result
.
dimY
();
++
i
)
{
double
min_dt
=
0.0
;
double
max_dt
=
0.0
;
if
(
vs
[
i
]
==
2
)
{
linestream
>>
min_dt
;
linestream
>>
max_dt
;
min_dt
=
min_dt
-
v
[
result
.
dimX
()
+
i
];
max_dt
=
max_dt
-
v
[
result
.
dimX
()
+
i
];
}
else
if
(
vs
[
i
]
==
1
)
{
double
dt
;
linestream
>>
dt
;
min_dt
=
-
dt
;
max_dt
=
dt
;
}
else
{
double
dt
=
args
.
get_float
(
"dt"
,
0.1
f
);
min_dt
=
-
dt
;
max_dt
=
dt
;
}
if
(
args
.
is_defined
(
"dt-relative"
))
{
v
[
result
.
dimX
()
+
result
.
dimY
()
+
i
]
=
v
[
result
.
dimX
()
+
i
]
*
(
1.0
+
min_dt
)
;
v
[
result
.
dimX
()
+
2
*
result
.
dimY
()
+
i
]
=
v
[
result
.
dimX
()
+
i
]
*
(
1.0
+
max_dt
)
;
}
else
if
(
args
.
is_defined
(
"dt-max"
))
{
v
[
result
.
dimX
()
+
result
.
dimY
()
+
i
]
=
v
[
result
.
dimX
()
+
i
]
+
std
::
max
(
v
[
result
.
dimX
()
+
i
]
*
min_dt
,
min_dt
);
v
[
result
.
dimX
()
+
2
*
result
.
dimY
()
+
i
]
=
v
[
result
.
dimX
()
+
i
]
+
std
::
max
(
v
[
result
.
dimX
()
+
i
]
*
max_dt
,
max_dt
);
}
else
{
v
[
result
.
dimX
()
+
result
.
dimY
()
+
i
]
=
v
[
result
.
dimX
()
+
i
]
+
min_dt
;
v
[
result
.
dimX
()
+
2
*
result
.
dimY
()
+
i
]
=
v
[
result
.
dimX
()
+
i
]
+
max_dt
;
}
// You can enforce the vertical segment to stay in the positive
// region using the --data-positive command line argument. Note
// that the data point is also clamped to zero if negative.
if
(
args
.
is_defined
(
"dt-positive"
))
{
v
[
result
.
dimX
()
+
i
]
=
std
::
max
(
v
[
result
.
dimX
()
+
i
],
0.0
);
v
[
result
.
dimX
()
+
result
.
dimY
()
+
i
]
=
std
::
max
(
v
[
result
.
dimX
()
+
result
.
dimY
()
+
i
],
0.0
);
v
[
result
.
dimX
()
+
2
*
result
.
dimY
()
+
i
]
=
std
::
max
(
v
[
result
.
dimX
()
+
2
*
result
.
dimY
()
+
i
],
0.0
);
}
#ifdef DEBUG
std
::
cout
<<
"<<DEBUG>> vs = ["
<<
v
[
result
.
dimX
()
+
result
.
dimY
()
+
i
]
<<
", "
<<
v
[
result
.
dimX
()
+
2
*
result
.
dimY
()
+
i
]
<<
"]"
<<
std
::
endl
;
#endif
}
result
.
_data
.
push_back
(
v
)
;
// Update min and max
for
(
int
k
=
0
;
k
<
result
.
dimX
();
++
k
)
{
result
.
_min
[
k
]
=
std
::
min
(
result
.
_min
[
k
],
v
[
k
])
;
result
.
_max
[
k
]
=
std
::
max
(
result
.
_max
[
k
],
v
[
k
])
;
}
}
}
if
(
args
.
is_defined
(
"data-correct-cosine"
))
result
.
save
(
"/tmp/data-corrected.dat"
);
std
::
cout
<<
"<<INFO>> loaded input stream"
<<
std
::
endl
;
std
::
cout
<<
"<<INFO>> data inside "
<<
result
.
_min
<<
" ... "
<<
result
.
_max
<<
std
::
endl
;
std
::
cout
<<
"<<INFO>> loading data input of R^"
<<
result
.
dimX
()
<<
" -> R^"
<<
result
.
dimY
()
<<
std
::
endl
;
std
::
cout
<<
"<<INFO>> "
<<
result
.
_data
.
size
()
<<
" elements to fit"
<<
std
::
endl
;
}
void
save_data_as_text
(
std
::
ostream
&
out
,
const
data
&
data
)
{
out
<<
"#DIM "
<<
data
.
dimX
()
<<
" "
<<
data
.
dimY
()
<<
std
::
endl
;
out
<<
"#PARAM_IN "
<<
params
::
get_name
(
data
.
input_parametrization
())
<<
std
::
endl
;
out
<<
"#PARAM_OUT "
<<
params
::
get_name
(
data
.
output_parametrization
())
<<
std
::
endl
;
for
(
int
i
=
0
;
i
<
data
.
size
();
++
i
)
{
vec
x
=
data
.
get
(
i
);
for
(
int
j
=
0
;
j
<
data
.
dimX
()
+
data
.
dimY
();
++
j
)
{
out
<<
x
[
j
]
<<
"
\t
"
;
}
out
<<
std
::
endl
;
}
}
sources/core/data_storage.h
0 → 100644
View file @
b3d65baf
/* ALTA --- Analysis of Bidirectional Reflectance Distribution Functions
Copyright (C) 2013, 2014, 2015 Inria
This file is part of ALTA.
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#pragma once
#include <iostream>
#include "data.h"
// Write DATA to OUT in ALTA's text format.
void
save_data_as_text
(
std
::
ostream
&
out
,
const
data
&
data
);
sources/core/vertical_segment.cpp
View file @
b3d65baf
...
@@ -9,12 +9,12 @@
...
@@ -9,12 +9,12 @@
file, You can obtain one at http://mozilla.org/MPL/2.0/. */
file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "vertical_segment.h"
#include "vertical_segment.h"
#include "data_storage.h"
#include <string>
#include <string>
#include <sstream>
#include <sstream>
#include <iostream>
#include <iostream>
#include <fstream>
#include <fstream>
#include <limits>
#include <algorithm>
#include <algorithm>
#include <cmath>
#include <cmath>
#include <cassert>
#include <cassert>
...
@@ -73,217 +73,6 @@ void vertical_segment::load(const std::string& filename, const arguments& args)
...
@@ -73,217 +73,6 @@ void vertical_segment::load(const std::string& filename, const arguments& args)
file
.
close
();
file
.
close
();
}
}
void
vertical_segment
::
load_data_from_text
(
std
::
istream
&
input
,
vertical_segment
&
result
,
const
arguments
&
args
)
{
vec
min
,
max
;
vec
ymin
,
ymax
;
result
.
_nX
=
0
;
result
.
_nY
=
0
;
std
::
vector
<
int
>
vs
;
int
current_vs
=
0
;
while
(
input
.
good
())
{
std
::
string
line
;
std
::
getline
(
input
,
line
)
;
std
::
stringstream
linestream
(
line
)
;
// Discard incorrect lines
if
(
linestream
.
peek
()
==
'#'
)
{
linestream
.
ignore
(
1
)
;
std
::
string
comment
;
linestream
>>
comment
;
if
(
comment
==
std
::
string
(
"DIM"
))
{
linestream
>>
result
.
_nX
>>
result
.
_nY
;
vs
.
reserve
(
result
.
dimY
())
;
for
(
int
k
=
0
;
k
<
result
.
dimY
();
++
k
)
{
vs
[
k
]
=
0
;
}
result
.
_min
.
resize
(
result
.
dimX
())
;
result
.
_max
.
resize
(
result
.
dimX
())
;
min
=
args
.
get_vec
(
"min"
,
result
.
_nX
,
-
std
::
numeric_limits
<
float
>::
max
())
;
max
=
args
.
get_vec
(
"max"
,
result
.
_nX
,
std
::
numeric_limits
<
float
>::
max
())
;
#ifdef DEBUG
std
::
cout
<<
"<<DEBUG>> data will remove outside of "
<<
min
<<
" -> "
<<
max
<<
" x-interval"
<<
std
::
endl
;
#endif
ymin
=
args
.
get_vec
(
"ymin"
,
result
.
_nY
,
-
std
::
numeric_limits
<
float
>::
max
())
;
ymax
=
args
.
get_vec
(
"ymax"
,
result
.
_nY
,
std
::
numeric_limits
<
float
>::
max
())
;
#ifdef DEBUG
std
::
cout
<<
"<<DEBUG>> data will remove outside of "
<<
ymin
<<
" -> "
<<
ymax
<<
" y-interval"
<<
std
::
endl
;
#endif
for
(
int
k
=
0
;
k
<
result
.
dimX
();
++
k
)
{
result
.
_min
[
k
]
=
std
::
numeric_limits
<
double
>::
max
()
;
result
.
_max
[
k
]
=
-
std
::
numeric_limits
<
double
>::
max
()
;
}
}
else
if
(
comment
==
std
::
string
(
"VS"
))
{
int
t
;
linestream
>>
t
;
vs
[
current_vs
]
=
t
;
++
current_vs
;
}
else
if
(
comment
==
std
::
string
(
"PARAM_IN"
))
{
std
::
string
param
;
linestream
>>
param
;
result
.
_in_param
=
params
::
parse_input
(
param
);
}
else
if
(
comment
==
std
::
string
(
"PARAM_OUT"
))
{
std
::
string
param
;
linestream
>>
param
;
result
.
_out_param
=
params
::
parse_output
(
param
);
}
continue
;
}
else
if
(
line
.
empty
())
{
continue
;
}
else
{
// Read the data point x and y coordinates
vec
v
=
vec
::
Zero
(
result
.
dimX
()
+
3
*
result
.
dimY
())
;
for
(
int
i
=
0
;
i
<
result
.
dimX
()
+
result
.
dimY
();
++
i
)
{
linestream
>>
v
[
i
]
;
}
// If data is not in the interval of fit
bool
is_in
=
true
;
for
(
int
i
=
0
;
i
<
result
.
dimX
();
++
i
)
{
if
(
v
[
i
]
<
min
[
i
]
||
v
[
i
]
>
max
[
i
])
{
is_in
=
false
;
}
}
for
(
int
i
=
0
;
i
<
result
.
dimY
();
++
i
)
{
if
(
v
[
result
.
dimX
()
+
i
]
<
ymin
[
i
]
||
v
[
result
.
dimX
()
+
i
]
>
ymax
[
i
])
{
is_in
=
false
;
}
}
if
(
!
is_in
)
{
continue
;
}
// /*
// Correction of the data by 1/cosine(theta_L)
double
factor
=
1.0
;
if
(
args
.
is_defined
(
"data-correct-cosine"
))
{
double
cart
[
6
];
params
::
convert
(
&
v
[
0
],
result
.
input_parametrization
(),
params
::
CARTESIAN
,
cart
);
if
(
cart
[
5
]
>
0.0
&&
cart
[
2
]
>
0.0
)
{
factor
=
1.0
/
cart
[
5
]
*
cart
[
2
];
for
(
int
i
=
0
;
i
<
result
.
dimY
();
++
i
)
{
v
[
i
+
result
.
dimX
()]
/=
factor
;
}
}
else
{
continue
;
}
}
// End of correction
// */
// Check if the data containt a vertical segment around the mean
// value.
for
(
int
i
=
0
;
i
<
result
.
dimY
();
++
i
)
{
double
min_dt
=
0.0
;
double
max_dt
=
0.0
;
if
(
vs
[
i
]
==
2
)
{
linestream
>>
min_dt
;
linestream
>>
max_dt
;
min_dt
=
min_dt
-
v
[
result
.
dimX
()
+
i
];
max_dt
=
max_dt
-
v
[
result
.
dimX
()
+
i
];
}
else
if
(
vs
[
i
]
==
1
)
{
double
dt
;
linestream
>>
dt
;
min_dt
=
-
dt
;
max_dt
=
dt
;
}
else
{
double
dt
=
args
.
get_float
(
"dt"
,
0.1
f
);
min_dt
=
-
dt
;
max_dt
=
dt
;
}
if
(
args
.
is_defined
(
"dt-relative"
))
{
v
[
result
.
dimX
()
+
result
.
dimY
()
+
i
]
=
v
[
result
.
dimX
()
+
i
]
*
(
1.0
+
min_dt
)
;
v
[
result
.
dimX
()
+
2
*
result
.
dimY
()
+
i
]
=
v
[
result
.
dimX
()
+
i
]
*
(
1.0
+
max_dt
)
;
}
else
if
(
args
.
is_defined
(
"dt-max"
))
{
v
[
result
.
dimX
()
+
result
.
dimY
()
+
i
]
=
v
[
result
.
dimX
()
+
i
]
+
std
::
max
(
v
[
result
.
dimX
()
+
i
]
*
min_dt
,
min_dt
);
v
[
result
.
dimX
()
+
2
*
result
.
dimY
()
+
i
]
=
v
[
result
.
dimX
()
+
i
]
+
std
::
max
(
v
[
result
.
dimX
()
+
i
]
*
max_dt
,
max_dt
);
}
else
{
v
[
result
.
dimX
()
+
result
.
dimY
()
+
i
]
=
v
[
result
.
dimX
()
+
i
]
+
min_dt
;
v
[
result
.
dimX
()
+
2
*
result
.
dimY
()
+
i
]
=
v
[
result
.
dimX
()
+
i
]
+
max_dt
;
}
// You can enforce the vertical segment to stay in the positive
// region using the --data-positive command line argument. Note
// that the data point is also clamped to zero if negative.
if
(
args
.
is_defined
(
"dt-positive"
))
{
v
[
result
.
dimX
()
+
i
]
=
std
::
max
(
v
[
result
.
dimX
()
+
i
],
0.0
);
v
[
result
.
dimX
()
+
result
.
dimY
()
+
i
]
=
std
::
max
(
v
[
result
.
dimX
()
+
result
.
dimY
()
+
i
],
0.0
);
v
[
result
.
dimX
()
+
2
*
result
.
dimY
()
+
i
]
=
std
::
max
(
v
[
result
.
dimX
()
+
2
*
result
.
dimY
()
+
i
],
0.0
);
}
#ifdef DEBUG
std
::
cout
<<
"<<DEBUG>> vs = ["
<<
v
[
result
.
dimX
()
+
result
.
dimY
()
+
i
]
<<
", "
<<
v
[
result
.
dimX
()
+
2
*
result
.
dimY
()
+
i
]
<<
"]"
<<
std
::
endl
;
#endif
}
result
.
_data
.
push_back
(
v
)
;
// Update min and max
for
(
int
k
=
0
;
k
<
result
.
dimX
();
++
k
)
{
result
.
_min
[
k
]
=
std
::
min
(
result
.
_min
[
k
],
v
[
k
])
;
result
.
_max
[
k
]
=
std
::
max
(
result
.
_max
[
k
],
v
[
k
])
;
}
}
}
if
(
args
.
is_defined
(
"data-correct-cosine"
))
result
.
save
(
"/tmp/data-corrected.dat"
);
std
::
cout
<<
"<<INFO>> loaded input stream"
<<
std
::
endl
;
std
::
cout
<<
"<<INFO>> data inside "
<<
result
.
_min
<<
" ... "
<<
result
.
_max
<<
std
::
endl
;
std
::
cout
<<
"<<INFO>> loading data input of R^"
<<
result
.
dimX
()
<<
" -> R^"
<<
result
.
dimY
()
<<
std
::
endl
;
std
::
cout
<<
"<<INFO>> "
<<
result
.
_data
.
size
()
<<
" elements to fit"
<<
std
::
endl
;
}
void
vertical_segment
::
get
(
int
i
,
vec
&
x
,
vec
&
yl
,
vec
&
yu
)
const
void
vertical_segment
::
get
(
int
i
,
vec
&
x
,
vec
&
yl
,
vec
&
yu
)
const
{
{
#ifdef DEBUG
#ifdef DEBUG
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment