参数是int 类型的,如果要画的线长度超过了 int 类型的最大值,或者要画带小数点长度的线段,该如何处理呢?
20 个解决方案
#1
改 BOOL LineTo( int x, int y ); 为 (long x,long y)试试(把MFC库都改了)
#2
老大,Windows下int是32位的,算算是多大?另外,画线肯定是在屏幕上,而屏幕上是以象素为准,象素肯定是整数啦。带小数的肯定要舍去尾部啦
#3
int的范围是-32768--32767吧。带小数的肯定要舍去尾部,那么AUTOCAD画线的长度是如何实现的啊。
#4
我在想,半个pixel怎么画:)
个人认为,-2147483648~2147483647之间屏幕也够了,另外半个pixel也应该没法实现,不知要做什么处理,如果超出的话,要自己写这个函数了
个人认为,-2147483648~2147483647之间屏幕也够了,另外半个pixel也应该没法实现,不知要做什么处理,如果超出的话,要自己写这个函数了
#5
半个pixel就四舍五入嘛。
#6
毒龙,你说的int的范围是dos下的,16位的,windows下的int是32位的
#7
如果我要画的一条线段的端点坐标是(0,123.456),是不是只能将它放大1000倍,即(0,123456)?
#8
pixel based GDI,当然不能画出小数座标来啦。当然你自己可以用anti-alias的算法模拟实现一下。
至于AutoCAD画线的长度,man,逻辑座标和设备座标更本就不是一个概念。
至于AutoCAD画线的长度,man,逻辑座标和设备座标更本就不是一个概念。
#9
那么如果我要画的一条线段的端点坐标是(0,123.456),该如何实现呢?
#10
duron1000(毒龙1000) int 的范围 -2^31 ~ 2^31 - 1,够用了
基于像素的,当然只能是Int
用以cm,mm为单位,坐标系变换,LineTo()就不能用了
基于像素的,当然只能是Int
用以cm,mm为单位,坐标系变换,LineTo()就不能用了
#11
对,int够用了,你可以类CRect看看,都是整数的,屏幕就那么大!!
如果真的超过你可以中间在极限处截断一点,然后接着这个点画条新的不就可以了。
如果真的超过你可以中间在极限处截断一点,然后接着这个点画条新的不就可以了。
#12
Auto CAD 是3D的, 3D的计算和3D不一样
#13
你在CAD中画图吗?CAD的函数可是Double类型的
#14
超過int型不會有這麼大吧!是不是搞錯!
設定小數可以用客戶座標來實現:
dc.SetMapMode(MM_ISOPROPIC);
dc.SetWindowExt(cx,cy);可按原先座標放大10-100倍都沒問題.
設定小數可以用客戶座標來實現:
dc.SetMapMode(MM_ISOPROPIC);
dc.SetWindowExt(cx,cy);可按原先座標放大10-100倍都沒問題.
#15
我是在CPictureView(基类是CScrollView)中画直线,点的坐标是Double类型的。函数
void CPictureView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100000;
SetScrollSizes(MM_HIMETRIC, sizeTotal);//
}
查MSDN:
void SetScrollSizes( int nMapMode, SIZE sizeTotal, const SIZE& sizePage = sizeDefault, const SIZE& sizeLine = sizeDefault );
Mapping Mode Logical Unit Positive y-axis Extends...
MM_TEXT 1 pixel Downward
MM_HIMETRIC 0.01 mm Upward
MM_TWIPS 1/1440 in Upward
MM_HIENGLISH 0.001 in Upward
MM_LOMETRIC 0.1 mm Upward
MM_LOENGLISH 0.01 in Upward
我将nMapMode设为MM_HIMETRIC,画直线时我将点坐标Double类型的值*100,再取整数部分,这样点的坐标是不是就可以精确到0.01mm了?
void CPictureView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100000;
SetScrollSizes(MM_HIMETRIC, sizeTotal);//
}
查MSDN:
void SetScrollSizes( int nMapMode, SIZE sizeTotal, const SIZE& sizePage = sizeDefault, const SIZE& sizeLine = sizeDefault );
Mapping Mode Logical Unit Positive y-axis Extends...
MM_TEXT 1 pixel Downward
MM_HIMETRIC 0.01 mm Upward
MM_TWIPS 1/1440 in Upward
MM_HIENGLISH 0.001 in Upward
MM_LOMETRIC 0.1 mm Upward
MM_LOENGLISH 0.01 in Upward
我将nMapMode设为MM_HIMETRIC,画直线时我将点坐标Double类型的值*100,再取整数部分,这样点的坐标是不是就可以精确到0.01mm了?
#16
首先注意一下下面的文档
To use a CDC object, construct it, and then call its member functions that parallel Windows functions that use device contexts.
Note Under Windows 95, all screen coordinates are limited to 16 bits. Therefore, an int passed to a CDC member function must lie in the range –32768 to 32767.
你绘图时可以使用double数据,强制转化成int使用设备坐标的映射模式绘图,受设备的限制,不可能出现在两个象素点中间绘图画点的情况,所以使用整形来绘图就足够了
置于上面说什么改MFC库,不可行,MFC最终都是调用Win API,比如LineTo调用::LineTo API函数
To use a CDC object, construct it, and then call its member functions that parallel Windows functions that use device contexts.
Note Under Windows 95, all screen coordinates are limited to 16 bits. Therefore, an int passed to a CDC member function must lie in the range –32768 to 32767.
你绘图时可以使用double数据,强制转化成int使用设备坐标的映射模式绘图,受设备的限制,不可能出现在两个象素点中间绘图画点的情况,所以使用整形来绘图就足够了
置于上面说什么改MFC库,不可行,MFC最终都是调用Win API,比如LineTo调用::LineTo API函数
#17
還能畫半個像素?長見識了。。。
#18
設定小數可以用客戶座標來實現:
dc.SetMapMode(MM_ISOPROPIC);
dc.SetWindowExt(cx,cy);可按原先座標放大10-100倍都沒問題.
////
能否详细介绍一下啊?
dc.SetMapMode(MM_ISOPROPIC);
dc.SetWindowExt(cx,cy);可按原先座標放大10-100倍都沒問題.
////
能否详细介绍一下啊?
#19
ding
#20
gdi是16位的库,你要用32位一定溢出。
用缩放,或者坐标偏移就可以基本解决问题。
通过运算计算出一个相对值,你的屏幕不可能有超过16位整形那么大的象素吧:D
用缩放,或者坐标偏移就可以基本解决问题。
通过运算计算出一个相对值,你的屏幕不可能有超过16位整形那么大的象素吧:D
#21
#1
改 BOOL LineTo( int x, int y ); 为 (long x,long y)试试(把MFC库都改了)
#2
老大,Windows下int是32位的,算算是多大?另外,画线肯定是在屏幕上,而屏幕上是以象素为准,象素肯定是整数啦。带小数的肯定要舍去尾部啦
#3
int的范围是-32768--32767吧。带小数的肯定要舍去尾部,那么AUTOCAD画线的长度是如何实现的啊。
#4
我在想,半个pixel怎么画:)
个人认为,-2147483648~2147483647之间屏幕也够了,另外半个pixel也应该没法实现,不知要做什么处理,如果超出的话,要自己写这个函数了
个人认为,-2147483648~2147483647之间屏幕也够了,另外半个pixel也应该没法实现,不知要做什么处理,如果超出的话,要自己写这个函数了
#5
半个pixel就四舍五入嘛。
#6
毒龙,你说的int的范围是dos下的,16位的,windows下的int是32位的
#7
如果我要画的一条线段的端点坐标是(0,123.456),是不是只能将它放大1000倍,即(0,123456)?
#8
pixel based GDI,当然不能画出小数座标来啦。当然你自己可以用anti-alias的算法模拟实现一下。
至于AutoCAD画线的长度,man,逻辑座标和设备座标更本就不是一个概念。
至于AutoCAD画线的长度,man,逻辑座标和设备座标更本就不是一个概念。
#9
那么如果我要画的一条线段的端点坐标是(0,123.456),该如何实现呢?
#10
duron1000(毒龙1000) int 的范围 -2^31 ~ 2^31 - 1,够用了
基于像素的,当然只能是Int
用以cm,mm为单位,坐标系变换,LineTo()就不能用了
基于像素的,当然只能是Int
用以cm,mm为单位,坐标系变换,LineTo()就不能用了
#11
对,int够用了,你可以类CRect看看,都是整数的,屏幕就那么大!!
如果真的超过你可以中间在极限处截断一点,然后接着这个点画条新的不就可以了。
如果真的超过你可以中间在极限处截断一点,然后接着这个点画条新的不就可以了。
#12
Auto CAD 是3D的, 3D的计算和3D不一样
#13
你在CAD中画图吗?CAD的函数可是Double类型的
#14
超過int型不會有這麼大吧!是不是搞錯!
設定小數可以用客戶座標來實現:
dc.SetMapMode(MM_ISOPROPIC);
dc.SetWindowExt(cx,cy);可按原先座標放大10-100倍都沒問題.
設定小數可以用客戶座標來實現:
dc.SetMapMode(MM_ISOPROPIC);
dc.SetWindowExt(cx,cy);可按原先座標放大10-100倍都沒問題.
#15
我是在CPictureView(基类是CScrollView)中画直线,点的坐标是Double类型的。函数
void CPictureView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100000;
SetScrollSizes(MM_HIMETRIC, sizeTotal);//
}
查MSDN:
void SetScrollSizes( int nMapMode, SIZE sizeTotal, const SIZE& sizePage = sizeDefault, const SIZE& sizeLine = sizeDefault );
Mapping Mode Logical Unit Positive y-axis Extends...
MM_TEXT 1 pixel Downward
MM_HIMETRIC 0.01 mm Upward
MM_TWIPS 1/1440 in Upward
MM_HIENGLISH 0.001 in Upward
MM_LOMETRIC 0.1 mm Upward
MM_LOENGLISH 0.01 in Upward
我将nMapMode设为MM_HIMETRIC,画直线时我将点坐标Double类型的值*100,再取整数部分,这样点的坐标是不是就可以精确到0.01mm了?
void CPictureView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100000;
SetScrollSizes(MM_HIMETRIC, sizeTotal);//
}
查MSDN:
void SetScrollSizes( int nMapMode, SIZE sizeTotal, const SIZE& sizePage = sizeDefault, const SIZE& sizeLine = sizeDefault );
Mapping Mode Logical Unit Positive y-axis Extends...
MM_TEXT 1 pixel Downward
MM_HIMETRIC 0.01 mm Upward
MM_TWIPS 1/1440 in Upward
MM_HIENGLISH 0.001 in Upward
MM_LOMETRIC 0.1 mm Upward
MM_LOENGLISH 0.01 in Upward
我将nMapMode设为MM_HIMETRIC,画直线时我将点坐标Double类型的值*100,再取整数部分,这样点的坐标是不是就可以精确到0.01mm了?
#16
首先注意一下下面的文档
To use a CDC object, construct it, and then call its member functions that parallel Windows functions that use device contexts.
Note Under Windows 95, all screen coordinates are limited to 16 bits. Therefore, an int passed to a CDC member function must lie in the range –32768 to 32767.
你绘图时可以使用double数据,强制转化成int使用设备坐标的映射模式绘图,受设备的限制,不可能出现在两个象素点中间绘图画点的情况,所以使用整形来绘图就足够了
置于上面说什么改MFC库,不可行,MFC最终都是调用Win API,比如LineTo调用::LineTo API函数
To use a CDC object, construct it, and then call its member functions that parallel Windows functions that use device contexts.
Note Under Windows 95, all screen coordinates are limited to 16 bits. Therefore, an int passed to a CDC member function must lie in the range –32768 to 32767.
你绘图时可以使用double数据,强制转化成int使用设备坐标的映射模式绘图,受设备的限制,不可能出现在两个象素点中间绘图画点的情况,所以使用整形来绘图就足够了
置于上面说什么改MFC库,不可行,MFC最终都是调用Win API,比如LineTo调用::LineTo API函数
#17
還能畫半個像素?長見識了。。。
#18
設定小數可以用客戶座標來實現:
dc.SetMapMode(MM_ISOPROPIC);
dc.SetWindowExt(cx,cy);可按原先座標放大10-100倍都沒問題.
////
能否详细介绍一下啊?
dc.SetMapMode(MM_ISOPROPIC);
dc.SetWindowExt(cx,cy);可按原先座標放大10-100倍都沒問題.
////
能否详细介绍一下啊?
#19
ding
#20
gdi是16位的库,你要用32位一定溢出。
用缩放,或者坐标偏移就可以基本解决问题。
通过运算计算出一个相对值,你的屏幕不可能有超过16位整形那么大的象素吧:D
用缩放,或者坐标偏移就可以基本解决问题。
通过运算计算出一个相对值,你的屏幕不可能有超过16位整形那么大的象素吧:D