📄 guibasic.lst
字号:
242 if(di<0)
243 { di += dy_x2; // 计算出下一步的决策值
244 }
245 else
246 { di += dy_x2 - dx_x2;
247 y0 += dy_sym;
248 }
249 }
250 GUI_Point(x0, y0, color); // 显示最后一点
251 }
252 else // 对于dx<dy,则使用y轴为基准
253 { di = dx_x2 - dy;
254 while(y0!=y1)
255 { GUI_Point(x0, y0, color);
256 y0 += dy_sym;
257 if(di<0)
258 { di += dx_x2;
259 }
260 else
261 { di += dx_x2 - dy_x2;
262 x0 += dx_sym;
263 }
264 }
265 GUI_Point(x0, y0, color); // 显示最后一点
266 }
267
268 }
269 /****************************************************************************
270 * 名称:GUI_LineWith()
271 * 功能:画任意两点之间的直线,并且可设置线的宽度。
272 * 入口参数: x0 直线起点的x坐标值
273 * y0 直线起点的y坐标值
274 * x1 直线终点的x坐标值
275 * y1 直线终点的y坐标值
276 * with 线宽(0-50)
277 * color 显示颜色
278 * 出口参数:无
279 * 说明:操作失败原因是指定地址超出有效范围。
280 ****************************************************************************/
281 void GUI_LineWith(uint32 x0, uint32 y0, uint32 x1, uint32 y1, uint8 with, uint8 color)
282 { int32 dx; // 直线x轴差值变量
283 int32 dy; // 直线y轴差值变量
284 int8 dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向
285 int8 dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向
286 int32 dx_x2; // dx*2值变量,用于加快运算速度
287 int32 dy_x2; // dy*2值变量,用于加快运算速度
288 int32 di; // 决策变量
289
290 int32 wx, wy; // 线宽变量
291 int32 draw_a, draw_b;
292
293 /* 参数过滤 */
294 if(with==0) return;
295 if(with>50) with = 50;
296
297 dx = x1-x0; // 求取两点之间的差值
298 dy = y1-y0;
299
C51 COMPILER V8.09 GUIBASIC 12/12/2007 14:46:39 PAGE 6
300 wx = with/2;
301 wy = with-wx-1;
302
303 /* 判断增长方向,或是否为水平线、垂直线、点 */
304 if(dx>0) // 判断x轴方向
305 { dx_sym = 1; // dx>0,设置dx_sym=1
306 }
307 else
308 { if(dx<0)
309 { dx_sym = -1; // dx<0,设置dx_sym=-1
310 }
311 else
312 { /* dx==0,画垂直线,或一点 */
313 wx = x0-wx;
314 if(wx<0) wx = 0;
315 wy = x0+wy;
316
317 while(1)
318 { x0 = wx;
319 GUI_RLine(x0, y0, y1, color);
320 if(wx>=wy) break;
321 wx++;
322 }
323
324 return;
325 }
326 }
327
328 if(dy>0) // 判断y轴方向
329 { dy_sym = 1; // dy>0,设置dy_sym=1
330 }
331 else
332 { if(dy<0)
333 { dy_sym = -1; // dy<0,设置dy_sym=-1
334 }
335 else
336 { /* dy==0,画水平线,或一点 */
337 wx = y0-wx;
338 if(wx<0) wx = 0;
339 wy = y0+wy;
340
341 while(1)
342 { y0 = wx;
343 GUI_HLine(x0, y0, x1, color);
344 if(wx>=wy) break;
345 wx++;
346 }
347 return;
348 }
349 }
350
351 /* 将dx、dy取绝对值 */
352 dx = dx_sym * dx;
353 dy = dy_sym * dy;
354
355 /* 计算2倍的dx及dy值 */
356 dx_x2 = dx*2;
357 dy_x2 = dy*2;
358
359 /* 使用Bresenham法进行画直线 */
360 if(dx>=dy) // 对于dx>=dy,则使用x轴为基准
361 { di = dy_x2 - dx;
C51 COMPILER V8.09 GUIBASIC 12/12/2007 14:46:39 PAGE 7
362 while(x0!=x1)
363 { /* x轴向增长,则宽度在y方向,即画垂直线 */
364 draw_a = y0-wx;
365 if(draw_a<0) draw_a = 0;
366 draw_b = y0+wy;
367 GUI_RLine(x0, draw_a, draw_b, color);
368
369 x0 += dx_sym;
370 if(di<0)
371 { di += dy_x2; // 计算出下一步的决策值
372 }
373 else
374 { di += dy_x2 - dx_x2;
375 y0 += dy_sym;
376 }
377 }
378 draw_a = y0-wx;
379 if(draw_a<0) draw_a = 0;
380 draw_b = y0+wy;
381 GUI_RLine(x0, draw_a, draw_b, color);
382 }
383 else // 对于dx<dy,则使用y轴为基准
384 { di = dx_x2 - dy;
385 while(y0!=y1)
386 { /* y轴向增长,则宽度在x方向,即画水平线 */
387 draw_a = x0-wx;
388 if(draw_a<0) draw_a = 0;
389 draw_b = x0+wy;
390 GUI_HLine(draw_a, y0, draw_b, color);
391
392 y0 += dy_sym;
393 if(di<0)
394 { di += dx_x2;
395 }
396 else
397 { di += dx_x2 - dy_x2;
398 x0 += dx_sym;
399 }
400 }
401 draw_a = x0-wx;
402 if(draw_a<0) draw_a = 0;
403 draw_b = x0+wy;
404 GUI_HLine(draw_a, y0, draw_b, color);
405 }
406
407 }
408 /****************************************************************************
409 * 名称:GUI_DrawLineS()
410 * 功能:多个点之间的连续连线。从第一点连到第二点,再连到第三点...
411 * 入口参数: points 多个点坐标数据的指针,数据排列为(x0,y0)、(x1,y1)、(x2,y2)...
412 * no 点数目,至少要大于1
413 * color 显示颜色
414 * 出口参数:无
415 * 说明:操作失败原因是指定地址超出有效范围。
416 ****************************************************************************/
417 void GUI_LineS(uint32 const *points, uint8 no, uint8 color)
418 { uint32 x0, y0;
419 uint32 x1, y1;
420 uint8 i;
421
422 /* 入口参数过滤 */
423 if(0==no) return;
C51 COMPILER V8.09 GUIBASIC 12/12/2007 14:46:39 PAGE 8
424 if(1==no) // 单点
425 { x0 = *points++;
426 y0 = *points;
427 GUI_Point(x0, y0, color);
428 }
429
430 /* 画多条线条 */
431 x0 = *points++; // 取出第一点坐标值,作为原起点坐标值
432 y0 = *points++;
433 for(i=1; i<no; i++)
434 { x1 = *points++; // 取出下一点坐标值
435 y1 = *points++;
436 GUI_Line(x0, y0, x1, y1, color);
437 x0 = x1; // 更新原起点坐标
438 y0 = y1;
439 }
440 }
441
442
443 /****************************************************************************
444 * 名称:GUI_Circle()
445 * 功能:指定圆心位置及半径,画圆。
446 * 入口参数: x0 圆心的x坐标值
447 * y0 圆心的y坐标值
448 * r 圆的半径
449 * color 显示颜色
450 * 出口参数:无
451 * 说明:操作失败原因是指定地址超出有效范围。
452 ****************************************************************************/
453 void GUI_Circle(uint32 x0, uint32 y0, uint32 r, uint8 color)
454 { int32 draw_x0, draw_y0; // 刽图点坐标变量
455 int32 draw_x1, draw_y1;
456 int32 draw_x2, draw_y2;
457 int32 draw_x3, draw_y3;
458 int32 draw_x4, draw_y4;
459 int32 draw_x5, draw_y5;
460 int32 draw_x6, draw_y6;
461 int32 draw_x7, draw_y7;
462 int32 xx, yy; // 画圆控制变量
463
464 int32 di; // 决策变量
465
466 /* 参数过滤 */
467 if(0==r) return;
468
469 /* 计算出8个特殊点(0、45、90、135、180、225、270度),进行显示 */
470 draw_x0 = draw_x1 = x0;
471 draw_y0 = draw_y1 = y0 + r;
472 if(draw_y0<SCREEN_HIGHT) GUI_Point(draw_x0, draw_y0, color); // 90度
473
474 draw_x2 = draw_x3 = x0;
475 draw_y2 = draw_y3 = y0 - r;
476 if(draw_y2>=0) GUI_Point(draw_x2, draw_y2, color); // 270度
477
478
479 draw_x4 = draw_x6 = x0 + r;
480 draw_y4 = draw_y6 = y0;
481 if(draw_x4<SCREEN_WIDTH) GUI_Point(draw_x4, draw_y4, color); // 0度
482
483 draw_x5 = draw_x7 = x0 - r;
484 draw_y5 = draw_y7 = y0;
485 if(draw_x5>=0) GUI_Point(draw_x5, draw_y5, color); // 180度
C51 COMPILER V8.09 GUIBASIC 12/12/2007 14:46:39 PAGE 9
486 if(1==r) return; // 若半径为1,则已圆画完
487
488
489 /* 使用Bresenham法进行画圆 */
490 di = 3 - 2*r; // 初始化决策变量
491
492 xx = 0;
493 yy = r;
494 while(xx<yy)
495 { if(di<0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -