c语言绘图:如何计算出一个缩放因子,以保证以任一点为圆心的圆形不会超出窗体边界?

2013-02-18 09:33:03 +08:00
 platoo
RT。假设窗体的大小为500 * 500,那么以300 * 300为圆心,半径为400的圆就会超出窗体,那么这个时候就要对其进行比例缩小,同样,如果还有一个以400*400,半径为400的圆超出窗体,怎样才能保证这两个同时使用相同的缩放因子?
4170 次点击
所在节点    程序员
9 条回复
diib
2013-02-18 11:14:08 +08:00
楼主没说清楚?
看意思是要将若干矢量图形缩放到窗口?

这个圆形方形三角形没关系吧。计算所有图形的总的矩形边界,然后根据这个边界矩形的形状和窗口矩形做比例,这个比例就应该是你要的缩放因子。
platoo
2013-02-18 12:59:05 +08:00
@diib 感谢!是2D画图。是这样的,有一个500 * 500的screen,和若干圆心不同的圆。要求所有的圆都要在窗体内完整显示出来,现在我能想通的是把圆心移动到screen的坐标原点 250 * 250,然后遍历多个圆,算出(coordinate + radius) / 500 的最大值,然后以此来计算所有圆使用的scale,也就是缩放因子。
没明白的地方是:
如果有一个圆,它的位置在screen的最边上,比如说450 * 450,那么算出来的缩放因子是不是对它不适用?他还是会被画出screen呢?
diib
2013-02-18 14:23:02 +08:00
@platoo

好像明白了,意思就是有若干圆c1,c2....cn,圆心都在 rect1里边,但是半径r1,r2....rn不定,需要求出一个缩放因子s,要求:所有圆心位置保持不动,半径按照s进行缩放,使所有圆能完整的包含在rect1里边?

如果是这样的话,你的算法是不成的,不能移动圆心位置。以圆c1为例子,要根据实际,求圆心(x1,y1)到窗口的4个边距的最小值l1,然后l1/r1得到c1的缩放因子s1。

然后遍历所有圆,得到最小的s1就是你要的因子。

--------------------------
如果不是上面那样,请参考我回复的第一条。
diib
2013-02-18 14:24:59 +08:00
优化什么的就不讲了,只是提供思路。
ch_linghu
2013-02-26 10:02:48 +08:00
我感觉可以通过计算所有圆占用的总的宽和高,形成一个外切矩形,然后将这个矩形等比例缩放到指定大小即可。这个比例就是所求比例。
platoo
2013-02-27 08:20:46 +08:00
@diib 我实现的方法是这样的:
考虑到上、下、左、右四个方向,比较 x + r, abs(x - r), y + r, abs(y - r)的最大值,作为x、y轴的最大偏移距离。也就是说存在最大圆a,xa和ya,求出factor = xa / width(screen的半径),然后根据factor求出所有圆,缩放后的x轴,y轴,半径。
之后进行world coordinate 到 screen coordinate的转换。
从结果上看,是符合要求的。
diib
2013-02-27 09:14:50 +08:00
看了你的做法才明白你的需求就是地图缩放中的全图显示问题。。。解决了就好。
platoo
2013-02-28 01:59:26 +08:00
@diib 是啊,刚接触图形这部分,很多情况自己都还描述不出来。很感谢~
diib
2013-02-28 07:34:33 +08:00
如果是全图显示,可以参考1楼和5楼。
你的算法是外切矩形法的变形。

不用客气。^_^

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/60580

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX