我现在的方法很简单,x=区域宽度/几等分,取整后乘第n条线。如将屏幕(800*600)四等分,则第一条线的x=取整(800/4)*1=200,第二条线的x=取整(800/4)*2=400
虽简单但不精确。如果区域宽度不能整除几等分(如上面的例子五等分时),算出来的值就不准确了,而且等分的越多越不准确。由于 x 值必须是整数,所以以现在的算法不能解决这个问题。
我对计算机图形学方面一窍不通,所以希望此项高手给预帮助,只需给出实现理论即可,多谢!!!
7 个解决方案
#1
如果楼主想绝对准确,好像是没有什么办法。
#2
如果区域宽度不能整除几等分(如上面的例子五等分时),算出来的值就不准确了
======
呵呵,五等分怎么不准确??
四舍五入下,各个区域相差不了多少。
======
呵呵,五等分怎么不准确??
四舍五入下,各个区域相差不了多少。
#3
绝对准确当然是不可能,只是如何控制每一等分的宽度,使最终的等分的宽度之和刚好等于总宽度。
四舍五入当然不行,那样宽度之和就不等于总宽度了,而且如果分的多了误差会很大。
这个问题很普遍,比如图表,各轴线表示从某个数值范围,比如从0到1000,但实际上在屏幕上画可能只有500个像素的宽度,也就是说,用500个像素表示0到1000个数值,那么如果要在轴上标出比如 345 这个数值,应该在哪个像素画这个点?
四舍五入当然不行,那样宽度之和就不等于总宽度了,而且如果分的多了误差会很大。
这个问题很普遍,比如图表,各轴线表示从某个数值范围,比如从0到1000,但实际上在屏幕上画可能只有500个像素的宽度,也就是说,用500个像素表示0到1000个数值,那么如果要在轴上标出比如 345 这个数值,应该在哪个像素画这个点?
#4
呵呵,也好解决,将误差放到最后一个区域里面就行了。
譬如800分7份,分别为:114+114+114+114+114+114+116=800就行了
譬如800分7份,分别为:114+114+114+114+114+114+116=800就行了
#5
这样虽然总宽度符合条件,但是在比较小的区域内多等分,会因为这两三个像素的差别,使其看起来不等分。
我的想法是,将这些误差,尽量均分在等分块内,使有误差的等分,其误差值在一个像素以内,这样看起来就不会很明显了。我现在想知道的就是这样的算法。
我的想法是,将这些误差,尽量均分在等分块内,使有误差的等分,其误差值在一个像素以内,这样看起来就不会很明显了。我现在想知道的就是这样的算法。
#6
也好办,先取整,然后将余数分给各个区域
(int)800/7=114;(每个区域的尺寸)
int m= 800 - (114 * 7)=2;
将m分别分给区域1和2就行了。
int k=7;//等分数
int[] data=new int[7];//每个区域尺寸数组
int s=(int)(800 / k);//每个区域的基本尺寸
for(int i=0;i<k;i++)
{
data[i]=s;
}
int m= 800 - (s * k);//剩余的增量
for(int i=0;i<m;i++)
{
data[i]+=1;
}
//试试这个行不。没测试,随手写的
(int)800/7=114;(每个区域的尺寸)
int m= 800 - (114 * 7)=2;
将m分别分给区域1和2就行了。
int k=7;//等分数
int[] data=new int[7];//每个区域尺寸数组
int s=(int)(800 / k);//每个区域的基本尺寸
for(int i=0;i<k;i++)
{
data[i]=s;
}
int m= 800 - (s * k);//剩余的增量
for(int i=0;i<m;i++)
{
data[i]+=1;
}
//试试这个行不。没测试,随手写的
#7
Graphics.DrawLine (Pen, PointF, PointF)是支持浮点数据的
#1
如果楼主想绝对准确,好像是没有什么办法。
#2
如果区域宽度不能整除几等分(如上面的例子五等分时),算出来的值就不准确了
======
呵呵,五等分怎么不准确??
四舍五入下,各个区域相差不了多少。
======
呵呵,五等分怎么不准确??
四舍五入下,各个区域相差不了多少。
#3
绝对准确当然是不可能,只是如何控制每一等分的宽度,使最终的等分的宽度之和刚好等于总宽度。
四舍五入当然不行,那样宽度之和就不等于总宽度了,而且如果分的多了误差会很大。
这个问题很普遍,比如图表,各轴线表示从某个数值范围,比如从0到1000,但实际上在屏幕上画可能只有500个像素的宽度,也就是说,用500个像素表示0到1000个数值,那么如果要在轴上标出比如 345 这个数值,应该在哪个像素画这个点?
四舍五入当然不行,那样宽度之和就不等于总宽度了,而且如果分的多了误差会很大。
这个问题很普遍,比如图表,各轴线表示从某个数值范围,比如从0到1000,但实际上在屏幕上画可能只有500个像素的宽度,也就是说,用500个像素表示0到1000个数值,那么如果要在轴上标出比如 345 这个数值,应该在哪个像素画这个点?
#4
呵呵,也好解决,将误差放到最后一个区域里面就行了。
譬如800分7份,分别为:114+114+114+114+114+114+116=800就行了
譬如800分7份,分别为:114+114+114+114+114+114+116=800就行了
#5
这样虽然总宽度符合条件,但是在比较小的区域内多等分,会因为这两三个像素的差别,使其看起来不等分。
我的想法是,将这些误差,尽量均分在等分块内,使有误差的等分,其误差值在一个像素以内,这样看起来就不会很明显了。我现在想知道的就是这样的算法。
我的想法是,将这些误差,尽量均分在等分块内,使有误差的等分,其误差值在一个像素以内,这样看起来就不会很明显了。我现在想知道的就是这样的算法。
#6
也好办,先取整,然后将余数分给各个区域
(int)800/7=114;(每个区域的尺寸)
int m= 800 - (114 * 7)=2;
将m分别分给区域1和2就行了。
int k=7;//等分数
int[] data=new int[7];//每个区域尺寸数组
int s=(int)(800 / k);//每个区域的基本尺寸
for(int i=0;i<k;i++)
{
data[i]=s;
}
int m= 800 - (s * k);//剩余的增量
for(int i=0;i<m;i++)
{
data[i]+=1;
}
//试试这个行不。没测试,随手写的
(int)800/7=114;(每个区域的尺寸)
int m= 800 - (114 * 7)=2;
将m分别分给区域1和2就行了。
int k=7;//等分数
int[] data=new int[7];//每个区域尺寸数组
int s=(int)(800 / k);//每个区域的基本尺寸
for(int i=0;i<k;i++)
{
data[i]=s;
}
int m= 800 - (s * k);//剩余的增量
for(int i=0;i<m;i++)
{
data[i]+=1;
}
//试试这个行不。没测试,随手写的
#7
Graphics.DrawLine (Pen, PointF, PointF)是支持浮点数据的