Parameters: verify the clamping operation
- systematic testing of boundary values for various numeric types - verify even clamping of an uint-128 when targeting float - verify signed / unsigned of different rank - demonstrate the clamping now integrated into `extractAs()` As an aside, move the `isNeg()` function (safe test for negative numbers) into util.hpp and fix related bugs with unsigned there.
This commit is contained in:
parent
e3b6b87e93
commit
e48c03e35d
4 changed files with 161 additions and 66 deletions
|
|
@ -47,6 +47,7 @@
|
|||
namespace lib {
|
||||
namespace par {
|
||||
|
||||
using util::isNeg;
|
||||
using std::same_as;
|
||||
using std::floating_point;
|
||||
using std::numeric_limits;
|
||||
|
|
@ -177,15 +178,8 @@ _Pragma("GCC diagnostic ignored \"-Woverloaded-virtual\"")
|
|||
or std::numeric_limits<SUB>::max() < std::numeric_limits<BAS>::max()
|
||||
or std::numeric_limits<SUB>::lowest() > std::numeric_limits<BAS>::lowest()
|
||||
;
|
||||
|
||||
template<typename NUM>
|
||||
inline constexpr bool
|
||||
isNeg (NUM const& num)
|
||||
{
|
||||
return num < NUM(0);
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
_Pragma("GCC diagnostic push") \
|
||||
_Pragma("GCC diagnostic ignored \"-Wsign-compare\"")
|
||||
// the following functions are specifically crafted to work around
|
||||
|
|
|
|||
|
|
@ -60,7 +60,9 @@ namespace util {
|
|||
inline constexpr int
|
||||
sgn (NUM n)
|
||||
{
|
||||
return (n==0)? 0 :((n<0)? -1:+1 );
|
||||
return n== NUM{0}? 0
|
||||
: n < NUM{0}? -1
|
||||
: +1;
|
||||
}
|
||||
|
||||
template <class N1, class N2>
|
||||
|
|
@ -77,12 +79,20 @@ namespace util {
|
|||
return n1 < n2? N1(n2) : n1;
|
||||
}
|
||||
|
||||
/** @remark safe to use also on unsigned */
|
||||
template<typename NUM>
|
||||
inline constexpr bool
|
||||
isNeg (NUM const& num)
|
||||
{
|
||||
return num < NUM{0};
|
||||
};
|
||||
|
||||
/** cut a numeric value to be >=0 */
|
||||
template <typename NUM>
|
||||
inline constexpr NUM
|
||||
noneg (NUM val)
|
||||
{
|
||||
return (0<val? val : 0);
|
||||
return max (val, NUM(0));
|
||||
}
|
||||
|
||||
/** force a numeric to be within bounds, inclusively */
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
//#include <utility>
|
||||
//#include <string>
|
||||
//#include <vector>
|
||||
#include <concepts>
|
||||
|
||||
//using std::string;
|
||||
//using std::vector;
|
||||
|
|
@ -35,20 +36,19 @@ namespace par {
|
|||
namespace test{
|
||||
|
||||
// using lumiera::error::LUMIERA_ERROR_LOGIC;
|
||||
using std::floating_point;
|
||||
|
||||
namespace {//Test fixture....
|
||||
|
||||
class Thing
|
||||
{ };
|
||||
template<typename NUM>
|
||||
constexpr NUM _MAX = std::numeric_limits<NUM>::max();
|
||||
|
||||
template<typename X>
|
||||
struct Some
|
||||
{
|
||||
X x;
|
||||
};
|
||||
template<typename NUM>
|
||||
constexpr NUM _MIN = std::numeric_limits<NUM>::lowest();
|
||||
|
||||
template<floating_point FLO>
|
||||
constexpr FLO _EPSILON = std::numeric_limits<FLO>::epsilon();
|
||||
|
||||
typedef Some<Thing> SomeThing;
|
||||
|
||||
}//(End)Test fixture
|
||||
|
||||
|
||||
|
|
@ -69,6 +69,7 @@ namespace test{
|
|||
run (Arg)
|
||||
{
|
||||
seedRand();
|
||||
|
||||
basics();
|
||||
verify_valueLimits();
|
||||
verify_valueAccess();
|
||||
|
|
@ -81,37 +82,93 @@ namespace test{
|
|||
}
|
||||
|
||||
|
||||
/** @test base operation to bracket a given value
|
||||
* so that it fits within another target type's value domain.
|
||||
* @note properly handles the signed vs. unsigned mismatch, so that
|
||||
* conversion from signed to unsigned can not wrap.
|
||||
*/
|
||||
void
|
||||
verify_valueLimits()
|
||||
{
|
||||
SHOW_EXPR(preClamp<int> (23))
|
||||
SHOW_EXPR(preClamp<int> (-55))
|
||||
SHOW_EXPR(preClamp<uint> (23))
|
||||
SHOW_EXPR(preClamp<uint> (-55))
|
||||
SHOW_EXPR((sub_domain<uint,int>))
|
||||
SHOW_EXPR((sub_domain<int,uint>))
|
||||
SHOW_EXPR((sub_domain<short,long>))
|
||||
SHOW_EXPR((sub_domain<long,short>))
|
||||
SHOW_EXPR(std::numeric_limits<uint>::max())
|
||||
SHOW_EXPR(std::numeric_limits<int>::max())
|
||||
SHOW_EXPR(std::numeric_limits<uint>::lowest())
|
||||
SHOW_EXPR(std::numeric_limits<int>::lowest())
|
||||
// Generic check if the first (target) type can hold
|
||||
// only a limited part of the second (source) type's domain
|
||||
CHECK ((sub_domain<uint,int> == true));
|
||||
CHECK ((sub_domain<int,uint> == true));
|
||||
CHECK ((sub_domain<short,long> == true));
|
||||
CHECK ((sub_domain<long,short> == false));
|
||||
CHECK ((sub_domain<float,double> == true));
|
||||
CHECK ((sub_domain<double,float> == false));
|
||||
|
||||
// Limit a value to within a target type's domain
|
||||
// (without actually converting into the target type)
|
||||
CHECK (preClamp<int> (23) == 23);
|
||||
CHECK (preClamp<int> (-55) == -55);
|
||||
CHECK (preClamp<uint> (23) == 23);
|
||||
CHECK (preClamp<uint>(-55) == 0);
|
||||
|
||||
SHOW_EXPR(preClamp<short> (INT64_MAX))
|
||||
SHOW_EXPR(preClamp<short> (INT64_MIN))
|
||||
CHECK (preClamp<short> (_MAX<int64_t>) == 32767);
|
||||
CHECK (preClamp<short> (_MIN<int64_t>) == -32768);
|
||||
|
||||
CHECK (preClamp<ushort> (_MAX<float>) == 65535);
|
||||
CHECK (preClamp<ushort> (_MIN<float>) == 0 );
|
||||
|
||||
// the return value has the same type as the argument...
|
||||
CHECK (preClamp<float> (_MAX<uint64_t>) == _MAX<uint64_t>);
|
||||
CHECK (preClamp<float> (_MIN<double>) == double(_MIN<float>) );
|
||||
|
||||
// Warning: the following is not standard C++, yet supported on GCC / CLang / libstdc++
|
||||
static_assert (_MAX<float> < _MAX<unsigned __int128>);
|
||||
CHECK (float(_MAX<unsigned __int128>) == "inf"_expect );
|
||||
CHECK ((unsigned __int128)_MAX<float> == "340282346638528859811704183484516925440"_expect );
|
||||
|
||||
CHECK (preClamp<float> (_MAX<unsigned __int128>) == (unsigned __int128)_MAX<float>);
|
||||
|
||||
SHOW_EXPR(preClamp<ushort> (numeric_limits<float>::max()))
|
||||
SHOW_EXPR(preClamp<ushort> (numeric_limits<float>::lowest()))
|
||||
// Note: a trigger at 0.5+ε is built into the clamp towards bool
|
||||
CHECK (preClamp<bool> (0.5) == 0 );
|
||||
CHECK (preClamp<bool> (0.5+_EPSILON<double>) == 1 );
|
||||
CHECK (preClamp<bool> (_MIN<double>) == 0 );
|
||||
|
||||
|
||||
// Systematic coverage of signed ⟷ unsigned
|
||||
CHECK (preClamp<int8_t> (_MAX<int16_t>) == 127);
|
||||
CHECK (preClamp<int8_t> ( int16_t{0}) == 0);
|
||||
CHECK (preClamp<int8_t> (_MIN<int16_t>) == -128);
|
||||
|
||||
SHOW_EXPR(preClamp<float> (numeric_limits<uint64_t>::max()))
|
||||
SHOW_EXPR(preClamp<float> (numeric_limits<double>::lowest()))
|
||||
CHECK (preClamp<int8_t> (_MAX<uint16_t>) == 127);
|
||||
CHECK (preClamp<int8_t> (_MIN<uint16_t>) == 0);
|
||||
|
||||
SHOW_EXPR(preClamp<bool> (0.5));
|
||||
SHOW_EXPR(preClamp<bool> (0.5 + numeric_limits<double>::epsilon()))
|
||||
SHOW_EXPR(preClamp<bool> (numeric_limits<double>::min()))
|
||||
CHECK (preClamp<uint8_t> (_MAX<int16_t>) == 255);
|
||||
CHECK (preClamp<uint8_t> ( int16_t{0}) == 0);
|
||||
CHECK (preClamp<uint8_t> (_MIN<int16_t>) == 0);
|
||||
|
||||
CHECK (preClamp<int16_t> (_MAX<int8_t>) == 127);
|
||||
CHECK (preClamp<int16_t> ( int8_t{0}) == 0);
|
||||
CHECK (preClamp<int16_t> (_MIN<int8_t>) == -128);
|
||||
|
||||
CHECK (preClamp<int16_t> (_MAX<uint8_t>) == 255);
|
||||
CHECK (preClamp<int16_t> (_MIN<uint8_t>) == 0);
|
||||
|
||||
CHECK (preClamp<uint16_t> (_MAX<int8_t>) == 127);
|
||||
CHECK (preClamp<uint16_t> ( int8_t{0}) == 0);
|
||||
CHECK (preClamp<uint16_t> (_MIN<int8_t>) == 0);
|
||||
|
||||
CHECK (preClamp<int8_t> (_MAX<int8_t>) == 127);
|
||||
CHECK (preClamp<int8_t> ( int8_t{0}) == 0);
|
||||
CHECK (preClamp<int8_t> (_MIN<int8_t>) == -128);
|
||||
|
||||
CHECK (preClamp<int8_t> (_MAX<uint8_t>) == 127);
|
||||
CHECK (preClamp<int8_t> (_MIN<uint8_t>) == 0);
|
||||
|
||||
CHECK (preClamp<uint8_t> (_MAX<int8_t>) == 127);
|
||||
CHECK (preClamp<uint8_t> ( int8_t{0}) == 0);
|
||||
CHECK (preClamp<uint8_t> (_MIN<int8_t>) == 0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/** @test base function to access the contents of an opaque buffer
|
||||
* with known type, and convert into another target type.
|
||||
*/
|
||||
void
|
||||
verify_valueAccess()
|
||||
{
|
||||
|
|
@ -133,6 +190,13 @@ SHOW_EXPR(preClamp<bool> (numeric_limits<double>::min()))
|
|||
TypeHandler<float>& df1{d1};
|
||||
df1.extractAs (target2, src1);
|
||||
CHECK (target2 == float(val1));
|
||||
|
||||
// value clamped to target domain...
|
||||
val1 = _MIN<int>;
|
||||
uint64_t target3{55};
|
||||
TypeHandler<uint64_t>& du64{d1};
|
||||
du64.extractAs (target3, src1);
|
||||
CHECK (target3 == _MIN<uint64_t>);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -83122,16 +83122,32 @@
|
|||
</node>
|
||||
<node CREATED="1784583716571" ID="ID_38727535" MODIFIED="1784583732840" TEXT="das Conforming muß u.U mehrstufig sein">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1784583737728" ID="ID_388891052" MODIFIED="1784583753674" TEXT="ein erster Schritt muß in der Quell-Domain erfolgen">
|
||||
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1784593401491" ID="ID_1670494263" MODIFIED="1784593411005" TEXT="Vorsicht Falle: signed vs unsigned">
|
||||
<node COLOR="#435e98" CREATED="1784583737728" ID="ID_388891052" MODIFIED="1784754065176" TEXT="ein erster Schritt muß in der Quell-Domain erfolgen">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node BACKGROUND_COLOR="#e0c28d" COLOR="#9a075c" CREATED="1784593401491" ID="ID_1670494263" MODIFIED="1784740605113" TEXT="Vorsicht Falle: signed vs unsigned">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node CREATED="1784593415546" ID="ID_985867046" MODIFIED="1784593437214" TEXT="die numeric-Limits werden im jeweiligen Typ angegeben"/>
|
||||
<node CREATED="1784593442299" ID="ID_814649582" MODIFIED="1784593459136" TEXT="bei direkten Vergleichen passiert zwar die erwartete Promotion"/>
|
||||
<node COLOR="#5b280f" CREATED="1784593459863" ID="ID_492548018" MODIFIED="1784593634425" TEXT="aber signed vs. unsigned- Werte lassen sich überhaupt nicht ohne Weiteres vergleichen">
|
||||
<arrowlink COLOR="#c30d0f" DESTINATION="ID_1240698281" ENDARROW="Default" ENDINCLINATION="318;0;" ID="Arrow_ID_1820583210" STARTARROW="None" STARTINCLINATION="195;6;"/>
|
||||
<node COLOR="#5b280f" CREATED="1784593459863" ID="ID_492548018" MODIFIED="1784740659183">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
aber signed vs. unsigned- Werte lassen sich
|
||||
</p>
|
||||
<p>
|
||||
gar nicht so ohne Weiteres vergleichen
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<arrowlink COLOR="#c30d0f" DESTINATION="ID_1240698281" ENDARROW="Default" ENDINCLINATION="318;0;" ID="Arrow_ID_1820583210" STARTARROW="None" STARTINCLINATION="28;3;"/>
|
||||
<icon BUILTIN="closed"/>
|
||||
<node CREATED="1784669864149" ID="ID_1893387322" MODIFIED="1784669867944" TEXT="man könnte....">
|
||||
<node CREATED="1784669870432" ID="ID_111028032" MODIFIED="1784669894580" TEXT="in Einzelfälle aufteilen">
|
||||
<node COLOR="#5b280f" CREATED="1784669870432" ID="ID_111028032" MODIFIED="1784740683624" TEXT="in Einzelfälle aufteilen">
|
||||
<icon BUILTIN="button_cancel"/>
|
||||
<node BACKGROUND_COLOR="#accdc3" COLOR="#3f4015" CREATED="1784669944683" ID="ID_739218208" MODIFIED="1784670003838" STYLE="fork" TEXT="Stackoverflow.AI generiert folgende Fallunterscheidung....">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
|
|
@ -83341,13 +83357,12 @@
|
|||
<font face="Monospaced" size="2">}</font>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<edge COLOR="#808080" STYLE="bezier" WIDTH="thin"/>
|
||||
<icon BUILTIN="wizard"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1784669896248" ID="ID_406155259" LINK="https://stackoverflow.com/a/53027613/444796" MODIFIED="1784670033706" TEXT="die Vergleichsoperation sicher machen">
|
||||
<node BACKGROUND_COLOR="#c8c0b6" COLOR="#435e98" CREATED="1784669896248" ID="ID_406155259" LINK="https://stackoverflow.com/a/53027613/444796" MODIFIED="1784740687444" TEXT="die Vergleichsoperation sicher machen">
|
||||
<node CREATED="1784670911841" ID="ID_601580251" MODIFIED="1784671009442" TEXT="man kann sicher auf "negativ" testen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
|
|
@ -83356,8 +83371,7 @@
|
|||
Unter der Annahme, daß lediglich die signed/unsigned Integers das Problem sind; denn für jeden Integer-Typ kann man val < TY(0) bilden
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<node CREATED="1784671014259" ID="ID_242078970" MODIFIED="1784671026710" TEXT="�� das sollte in util-hpp"/>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1784671027530" ID="ID_398950707" MODIFIED="1784671109521" TEXT="oops ... da ist geich daneben ein Bug">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -83367,8 +83381,7 @@
|
|||
die Funktion "noneg()" macht den Verlgeich genau falsch herum:  <font color="#a10000">0 < uint(-1) ⟹ true</font>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -83381,8 +83394,7 @@
|
|||
hier hilft uns die automatische Promotion in den Typ mit dem höheren Rank: nur deshalb können wir die Vergleichsoperation machen. Zudem kann der Verleich im negativen Segment überhaupt nur stattfinden, wenn beide Typen negativ sind, also mithin signed
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1784676822935" ID="ID_148161124" MODIFIED="1784676835365" TEXT="sonst genügt es, festzustellen, wer auf der negativen Seite steht"/>
|
||||
</node>
|
||||
|
|
@ -83398,16 +83410,34 @@
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1784740694926" HGAP="116" ID="ID_884664715" MODIFIED="1784753995212" TEXT="Testabdeckung....">
|
||||
<icon BUILTIN="yes"/>
|
||||
<node CREATED="1784753603557" ID="ID_673330401" MODIFIED="1784753614651" TEXT="int ⟷ uint"/>
|
||||
<node CREATED="1784753615308" ID="ID_882206102" MODIFIED="1784753629486" TEXT="integer ⟷ floating point"/>
|
||||
<node CREATED="1784753630562" ID="ID_380930919" MODIFIED="1784753657666" TEXT="non-standard type 128-bit integer">
|
||||
<node CREATED="1784753670316" ID="ID_1012177379" MODIFIED="1784753695781" TEXT="(unterstützt in GCC und libstdc++ im Gnu-Modus)"/>
|
||||
<node CREATED="1784753660673" ID="ID_282192889" MODIFIED="1784753664932" TEXT="wird in float gekappt"/>
|
||||
</node>
|
||||
<node CREATED="1784753701406" ID="ID_585682892" MODIFIED="1784753725785" TEXT="trigger-Schwelle für bool bei 0.5+ε"/>
|
||||
<node CREATED="1784753874143" ID="ID_801539454" MODIFIED="1784753893936" TEXT="systematisch alle Domain-Relationen signed ⟷ unsigned">
|
||||
<node CREATED="1784753898316" ID="ID_1214113459" MODIFIED="1784753906114" TEXT="integers von verschiedenem Rank"/>
|
||||
<node CREATED="1784753908650" ID="ID_350184416" MODIFIED="1784753916276" TEXT="aber auch der gleiche Rank auf beiden Seiten"/>
|
||||
</node>
|
||||
<node CREATED="1784753940609" ID="ID_1656941400" MODIFIED="1784753975081" TEXT="Limitieren auch in extracAs<TY>() demonstrieren">
|
||||
<linktarget COLOR="#4da5bd" DESTINATION="ID_1656941400" ENDARROW="Default" ENDINCLINATION="-128;80;" ID="Arrow_ID_543303907" SOURCE="ID_1748150865" STARTARROW="None" STARTINCLINATION="803;34;"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1784754033268" ID="ID_1076783794" MODIFIED="1784754058137" TEXT="erst danach den limitierten Wert zuweisen oder konvertieren"/>
|
||||
</node>
|
||||
<node CREATED="1784583754452" ID="ID_1524391258" MODIFIED="1784583768830" TEXT="dann kann innerhalb der Wert-BaseDomain eine weitere Einschränkung folgen"/>
|
||||
<node CREATED="1784586543839" ID="ID_1702195769" MODIFIED="1784586550867" TEXT="Teil-Operationen">
|
||||
<node CREATED="1784586551999" ID="ID_1288354893" MODIFIED="1784586565918" TEXT="preClamp<TAR> (SRC const&)">
|
||||
<node CREATED="1784586572069" ID="ID_70379943" MODIFIED="1784586582520" TEXT="läßt sich komplett generisch implementieren"/>
|
||||
<node CREATED="1784586675600" ID="ID_876196754" MODIFIED="1784588546088" TEXT="concept sub_domain<SUB,BAS>">
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#a4060f" CREATED="1784593517692" ID="ID_1240698281" MODIFIED="1784593627634" TEXT="muß hier signed ≠ unsigned explizit prüfen">
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#a4060f" CREATED="1784593517692" ID="ID_1240698281" MODIFIED="1784740659183" TEXT="muß hier signed ≠ unsigned explizit prüfen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
|
|
@ -83416,7 +83446,7 @@
|
|||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<linktarget COLOR="#c30d0f" DESTINATION="ID_1240698281" ENDARROW="Default" ENDINCLINATION="318;0;" ID="Arrow_ID_1820583210" SOURCE="ID_492548018" STARTARROW="None" STARTINCLINATION="195;6;"/>
|
||||
<linktarget COLOR="#c30d0f" DESTINATION="ID_1240698281" ENDARROW="Default" ENDINCLINATION="318;0;" ID="Arrow_ID_1820583210" SOURCE="ID_492548018" STARTARROW="None" STARTINCLINATION="28;3;"/>
|
||||
</node>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1784593545688" ID="ID_1890105632" MODIFIED="1784593569629" TEXT="kann außerdem gleich das Trigger-Verhalten für Booleans implementieren">
|
||||
|
|
@ -83433,7 +83463,7 @@
|
|||
</node>
|
||||
</node>
|
||||
<node CREATED="1784588917160" ID="ID_174389664" MODIFIED="1784588970730" TEXT="beide Zuweisungs-Operationen auf Basis des »conforming«- reimplementieren">
|
||||
<node CREATED="1784589831498" HGAP="30" ID="ID_1748150865" MODIFIED="1784591447465" TEXT="denn auch beim Extrahieren kann eine Limitierung notwendig sein" VSHIFT="-6">
|
||||
<node CREATED="1784589831498" HGAP="30" ID="ID_1748150865" MODIFIED="1784753983595" TEXT="denn auch beim Extrahieren kann eine Limitierung notwendig sein" VSHIFT="-6">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head/>
|
||||
<body>
|
||||
|
|
@ -83442,6 +83472,7 @@
|
|||
</p>
|
||||
</body>
|
||||
</html></richcontent>
|
||||
<arrowlink COLOR="#4da5bd" DESTINATION="ID_1656941400" ENDARROW="Default" ENDINCLINATION="-128;80;" ID="Arrow_ID_543303907" STARTARROW="None" STARTINCLINATION="803;34;"/>
|
||||
<linktarget COLOR="#4490cf" DESTINATION="ID_1748150865" ENDARROW="Default" ENDINCLINATION="-102;-5;" ID="Arrow_ID_1245799800" SOURCE="ID_1119403748" STARTARROW="None" STARTINCLINATION="-15;97;"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#b3020b" CREATED="1784674883894" ID="ID_25505345" MODIFIED="1784674910088" TEXT="viele offene Flanken hier: setzt eigentlich »zahlenartige« Basistypen vorraus">
|
||||
|
|
@ -83510,8 +83541,7 @@
|
|||
</li>
|
||||
</ul>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1784672543927" ID="ID_1055715376" MODIFIED="1784673139404" TEXT="beruhen die BaseDomains eigentlich immer auf einem »numerischen« Parameter?">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -83521,8 +83551,7 @@
|
|||
Im ersten Entwurf habe ich die unterliegenden Typen einfach in eine Typelist gepackt. Die Analyse zeigte ganz klar, daß diese Menge der Basiswerte bereits zur Compile-time festgelegt sein muß, sonst tun sich ganz ekelhafte Probleme auf mit Registrierung und Locking im Zusammenhang mit dem Laden von dynamischen Objekten (Plug-ins)....
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1784672259758" ID="ID_1765265570" MODIFIED="1784673727205" TEXT="wie gehen wir mit Produkttypen um (Vektoren, Farben)?">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -83532,8 +83561,7 @@
|
|||
Ein billiger Ansatz wäre, das Thema zu ignorieren, und solche Parameter einfach als eine Gruppe von Einzelparametern zu behandeln. Das wäre angemessen, wenn man das als Randthema betrachtet. Gegen diesen Ansatz spricht, daß man an einen Farbwert auch eine Kalibrierungskurve und einen Farbraum anhängen möchte, sonst wird Arbeiten mit professionellen Medien-Produktionsprozessen (HDR, Grading, Mastering) praktisch unmöglich. Auch an verschiedene Spielarten von »3D« sollte man denken, incl. virtueller Projektionsräume. Ein MIttelweg wäre, daß man Parameter-Tupel unterstützt, denen Metadaten angehängt werden
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1784672899810" ID="ID_116986809" MODIFIED="1784673414049" TEXT="wie steht's mit der Animation von »shape Keys« und Masken?">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
@ -83543,8 +83571,7 @@
|
|||
....zunächst einmal sind das Produkttypen, aber mit einer hohen Kardinalität. Das Konzept der Shape-Keys reduziert das wieder auf eine Achse, auf der man einen Kontrollparameter animieren kann. Bei Masken besteht das zusätzliche (in der Praxis sehr relevante) Problem, daß »unterwegs« weitere Maskenpunkte dazukommen können, und daß einzelne Maskenpunkte noch weitere Parameter tragen können, wie z.B. eine feather-strength, was extrem wichtig ist für Rotoscoping.
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
<node CREATED="1784673142319" ID="ID_79827229" MODIFIED="1784673414046" TEXT="es könnte auf zwei Kategorien hinauslaufen: einfach vs komplex">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
|
|
|
|||
Loading…
Reference in a new issue