怎么编ps画直线怎么是矩形?矩形?

gtk+&点,直线,矩形,弧形,多边形,文本
一旦理解了绘图区、颜色、、和字体,绘图就会变得很简单了。本节简要介绍了Gdk的相关绘图函数。要注意的是绘图是一种器端的操作,例如,如果要画一条线,Xlib会将线的端点传给服务器,服务器用特定的GC(GC也是一种服务器端资源)做实际的绘图操作。创建绘图应用时通常要考虑程序的性能。
16.9.1画点
可以用gdk_draw_point()函数画一个点,或用gdk_draw_points()函数画多个点。点是用当前的前景颜色画的。多个点是由一个GdkPoint数组给出的。GdkPoint结构如下所示:
typedefstruct_GdkPointGdkP
struct_GdkPoint
注意,X坐标是从绘图区的左上角开始的,是一个有符号的16位整数。函数列表:画点
#include&gdk/gdk.h&
voidgdk_draw_point(GdkDrawable*drawable,
voidgdk_draw_points(GdkDrawable*drawable,
GdkPoint*points,
gintnpoints)
16.9.2画线
用gdk_draw_line()函数画一条线,将线的端点作为它的参数。要画几条连接着的线,可调用gdk_draw_lines()函数,并将
点的列表作为参数传到函数中。Gdk会将点连接起来。要画多条不必连接起来的线,可调用gdk_draw_segments()函数,将线段列表作为参数
传到函数中。
GdkSegment结构是这样定义的:
typedefstruct_GdkSegmentGdkS
struct_GdkSegment
如果在同一个绘画请求中画出的线或者线段的端点是相交的,它们会以GC中的“连接风格”连接起来。
函数列表:画线
#include&gdk/gdk.h&
voidgdk_draw_line(GdkDrawable*drawable,
voidgdk_draw_lines(GdkDrawable*drawable,
GdkPoint*points,
gintnpoints)
voidgdk_draw_segments(GdkDrawable*drawable,
GdkSegment*segments,
gintnsegments)
16.9.3矩形
用gdk_draw_rectangle()函数画矩形。其中filled参数指明是否填充矩形,设为TRUE意味着填充它,FALSE则不填充。
函数列表:画矩形
#include&gdk/gdk.h&
voidgdk_draw_rectangle(GdkDrawable*drawable,
gintfilled,
gintwidth,
gintheight)
16.9.4画弧
gdk_draw_arc()函数画一个椭圆或椭圆弧。弧可以是填充的,也可以是不填充的,第3个参数切换填充状态。第4到第7个参数描绘了一个矩
形,椭圆内切于这个矩形;angle1参数是画弧的起始角,它以时钟三点钟位置为0°;angle2是绕圆弧旋转的角度,如果值是正的,逆时针旋转,否则
顺时针旋转。参数angle1和angle2都是以1/64度来指定的,所以360°就是360&64。这样可以更精确地指定弧形的尺寸和形状,而不需使
用浮点数。参数angle2不要超过360°,因为对椭圆来说旋转角度超过360°没有什么意义。
要画一个圆,在正方形内从0到360&64画一个弧:
gdk_draw_arc(drawable,gc,TRUE,
0,360*64);
要画一个半椭圆,改变长轴和短轴的比例,角度从0到180&64:
gdk_draw_arc(drawable,gc,TRUE,
0,180*64);
有许多X服务器在用来画填充圆弧的边缘时是很难看的,特别是很小的圆看起来会不太圆。要解决这个问题,可以在画圆时把圆的轮廓也画出来。
函数列表:画弧
#include&gdk/gdk.h&
voidgdk_draw_arc(GdkDrawable*drawable,
gintfilled,
gintwidth,
gintheight,
gintangle1,
gintangle2)
16.9.5多边形
gdk_draw_polygon()函数用来画一个填充或不填充的多边形。注意,也可以用gdk_draw_lines()函数画一个不填充的多边形。这那种方法并没有什么实质区别。
gdk_draw_polygon()函数的参数与gdk_draw_lines()中的参数完全一样。多边形不一定必须是凸多边形。它的边可以是
交叉的(自交)。自交的多边形用一种“奇-偶规则”来填充,规则是重叠奇数次的多边形区域是不填充的。也就是,如果多边形不是重叠的,它就是完全填充的;
如果一个区域重叠了一次,它不会被填充;如果它重叠了两次,它会被填充等等。
函数列表:画多边形
#include&gdk/gdk.h&
voidgdk_draw_polygon(GdkDrawable*drawable,
gintfilled,
GdkPoint*points,
gintnpoints)
16.9.6文本
有两个函数可用于绘制字符串:gdk_draw_text()和gdk_draw_string()。其中gdk_draw_text()是最好的
方法。gdk_draw_text()用字符串的长度作为参数,而gdk_draw_string()函数用strlen()函数计算字符串的长度。函数
中的x和y坐标指定要绘制的文本基线的左边位置。文本是用前景颜色绘出的。
在Gdk中没有方法画出缩放的或旋转的文本。GnomeCanvasText构件提供了一个较慢的、质量较低的方法来渲染缩放的和旋转的文本。如果
需要高质量的按比例缩放的和旋转的文本,则需要使用额外的库函数,比如说对Type1fonts字体使用t1lib库函数,或对
TrueTypefonts
字体使用FreeType库函数,或者使用DisplayPostscript的X扩展(XDPS)。GNU项目组正致力于开发一个免费的XDPS的
Linux版本。作为gnome-print库的一部分,Gnome项目组也正在开发一个文本绘图方案。
函数列表:画文本
#include&gdk/gdk.h&
voidgdk_draw_string(GdkDrawable*drawable,
GdkFont*font,
constgchar*text)
voidgdk_draw_text(GdkDrawable*drawable,
GdkFont*font,
constgchar*text,
ginttext_length)
16.9.7pixmap像素映射图形
gdk_draw_pixmap()从一个像素映射图形中复制一个区域到另一个绘图区(像素映射或窗口)。绘图区的源和目的必须有相同的深度和视件
(visual)。如果给width或height参数传递-1值,会将源pixmap图片全部复制过去。源图片可以是任何绘图区,包括窗口,但是如果源
是一个窗口,使用gdk_window_copy_area()函数将使代码更清晰。下面是gdk_draw_pixmap()函数的声明形式。
函数列表:画pixmaps图形
#include&gdk/gdk.h&
voidgdk_draw_pixmap(GdkDrawable*drawable,
GdkDrawable*src,
gintxdest,
gintydest,
gintwidth,
gintheight)
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。import flash.display.S
import flash.events.MouseE
import flash.text.TextF
[SWF(width=375,height=300,backgroundColor="0xeeeeee")]
public class RectLine extends Sprite
private var txt:TextF
public function RectLine()
this.txt = new TextField();
addChild(txt);
stage.addEventListener(MouseEvent.CLICK,ckHandler);
ckHandler(null);
private function ckHandler(e:MouseEvent):void
graphics.clear();
graphics.beginFill(0x00ffff);
graphics.drawRect(100,100,200,50);
graphics.endFill();
var a:int = Math.random()*375;
var b:int = Math.random()*300;
var c:int = Math.random()*375;
var d:int = Math.random()*300;
graphics.lineStyle(2,0xff0000);
graphics.moveTo(a,b);
graphics.lineTo(c,d);
trace(isLineIntersectRectangle(a,b,c,d,100,100,300,150));
var isF:Boolean = isLineIntersectRectangle(a,b,c,d,100,100,300,150);
txt.text = "是否相交:"+isF;
/** &p&判断线段是否在矩形内 &/p&
* 先看线段所在直线是否与矩形相交,
* 如果不相交则返回false,
* 如果相交,
* 则看线段的两个点是否在矩形的同一边(即两点的x(y)坐标都比矩形的小x(y)坐标小,或者大),
* 若在同一边则返回false,
* 否则就是相交的情况。
* @param linePointX1 线段起始点x坐标
* @param linePointY1 线段起始点y坐标
* @param linePointX2 线段结束点x坐标
* @param linePointY2 线段结束点y坐标
* @param rectangleLeftTopX 矩形左上点x坐标
* @param rectangleLeftTopY 矩形左上点y坐标
* @param rectangleRightBottomX 矩形右下点x坐标
* @param rectangleRightBottomY 矩形右下点y坐标
* @return 是否相交
private function isLineIntersectRectangle(linePointX1:Number,
linePointY1:Number,
linePointX2:Number,
linePointY2:Number,
rectangleLeftTopX:Number,
rectangleLeftTopY:Number,
rectangleRightBottomX:Number,
rectangleRightBottomY:Number):Boolean
lineHeight:Number = linePointY1 - linePointY2;
var lineWidth:Number = linePointX2 - linePointX1;
// 计算叉乘
var c:Number = linePointX1 * linePointY2 - linePointX2 * linePointY1;
if ((lineHeight * rectangleLeftTopX + lineWidth * rectangleLeftTopY + c &= 0 && lineHeight * rectangleRightBottomX + lineWidth * rectangleRightBottomY + c &= 0)
|| (lineHeight * rectangleLeftTopX + lineWidth * rectangleLeftTopY + c &= 0 && lineHeight * rectangleRightBottomX + lineWidth * rectangleRightBottomY + c &= 0)
|| (lineHeight * rectangleLeftTopX + lineWidth * rectangleRightBottomY + c &= 0 && lineHeight * rectangleRightBottomX + lineWidth * rectangleLeftTopY + c &= 0)
|| (lineHeight * rectangleLeftTopX + lineWidth * rectangleRightBottomY + c &= 0 && lineHeight * rectangleRightBottomX + lineWidth * rectangleLeftTopY + c &= 0))
if (rectangleLeftTopX & rectangleRightBottomX) {
var temp:Number = rectangleLeftTopX;
rectangleLeftTopX = rectangleRightBottomX;
rectangleRightBottomX =
if (rectangleLeftTopY & rectangleRightBottomY) {
var temp1:Number = rectangleLeftTopY;
rectangleLeftTopY = rectangleRightBottomY;
rectangleRightBottomY = temp1;
if ((linePointX1 & rectangleLeftTopX && linePointX2 & rectangleLeftTopX)
|| (linePointX1 & rectangleRightBottomX && linePointX2 & rectangleRightBottomX)
|| (linePointY1 & rectangleLeftTopY && linePointY2 & rectangleLeftTopY)
|| (linePointY1 & rectangleRightBottomY && linePointY2 & rectangleRightBottomY)) {
阅读(...) 评论()

我要回帖

更多关于 直线 矩形 交点 的文章

 

随机推荐