Giter Club home page Giter Club logo

g's Introduction

English | 简体中文

G

CI Coverage Status semantic-release: angular

TypeScript License

npm package npm downloads Percentage of issues still open PRs Welcome

As the underlying rendering engine of AntV, G is dedicated to provide consistent and high performance 2D / 3D graphics rendering capabilities for upper layer products, adapting all underlying rendering APIs (Canvas2D / SVG / WebGL / WebGPU / CanvasKit / Node.js) on the web side. In particular, it provides GPGPU support for algorithms suitable for parallel computing in graph scenarios.

D3 force directed graph D3 barchart D3 sketchy barchart Yoga plugin Box2D physics engine plugin Rough.js plugin Canvaskit plugin Yoga plugin Canvaskit plugin 3D force directed graph

✨ Features

Easy-to-use API。The graphics and event system is compatible with DOM Element & Event API, and the animation system is compatible with Web Animations API, which can be adapted to the existing ecosystem of Web side such as D3, Hammer.js gesture library, etc. at a very low cost.

Support multiple rendering environments。Support Canvas2D / SVG / WebGL / WebGPU / CanvasKit and runtime switching, and also server-side rendering.

High performance rendering and computing。WebGPU-based GPGPU support for parallelizable algorithms. webgpu-graph is a library of graph analysis algorithms using GPU acceleration.

Extensible plug-in mechanism and rich set of plug-ins:

📦 Install

# Install Core
$ npm install @antv/g --save
# Canvas Renderer
$ npm install @antv/g-canvas --save
# SVG Renderer
$ npm install @antv/g-svg --save
# WebGL Renderer
$ npm install @antv/g-webgl --save

🔨 Usage

<div id="container"></div>
import { Circle, Canvas, CanvasEvent } from '@antv/g';
import { Renderer as CanvasRenderer } from '@antv/g-canvas';
// or
// import { Renderer as WebGLRenderer } from '@antv/g-webgl';
// import { Renderer as SVGRenderer } from '@antv/g-svg';

// create a canvas
const canvas = new Canvas({
    container: 'container',
    width: 500,
    height: 500,
    renderer: new CanvasRenderer(), // select a renderer
});

// create a circle
const circle = new Circle({
    style: {
        cx: 100,
        cy: 100,
        r: 50,
        fill: 'red',
        stroke: 'blue',
        lineWidth: 5,
    },
});

canvas.addEventListener(CanvasEvent.READY, function () {
    // append to canvas
    canvas.appendChild(circle);

    // add listener for `click` event
    circle.addEventListener('click', function () {
        this.style.fill = 'green';
    });
});

⌨️ Development

Start previewing demos:

git clone [email protected]:antvis/g.git
cd g
pnpm install
pnpm build
pnpm dev

API Spec

Start a dev-server on root dir, eg. http-server:

http-server -p 9090

Open api.html on localhost:9090/spec/api.html.

Run test cases

Build and run test cases:

pnpm build
pnpm test

Run demos

Preview our dev demos:

pnpm build
pnpm dev

Inspired by

Contributors


dengfuping


xiaoiver


dxq613


dependabot-preview[bot]


zhanba


afc163


limichange


entronad


hustcc


tangying1027


zengyue


simaQ


lessmost


visiky


lxfu1


ICMI


Deturium


Yanyan-Wang


yiiiiiiqianyao


moayuisuda


elaine1234


mxz96102


DrugsZ


baizn


terence55


tyr1dev


budlion


luoxupan


ikxin


Leannechn


dev-itsheng

This project follows the git-contributor spec, auto updated at Wed Jun 21 2023 13:21:24 GMT+0800.

g's People

Contributors

1wkk avatar afc163 avatar ai-qing-hai avatar baizn avatar budlion avatar dengfuping avatar dependabot-preview[bot] avatar deturium avatar drugsz avatar dxq613 avatar elaine1234 avatar entronad avatar hustcc avatar icmi avatar lessmost avatar lijinke666 avatar limichange avatar lxfu1 avatar moayuisuda avatar mxz96102 avatar semantic-release-bot avatar simaq avatar tangying1027 avatar terence55 avatar visiky avatar xiaoiver avatar yanyan-wang avatar yiiiiiiqianyao avatar zengyue avatar zhanba avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

g's Issues

path的BBox计算逻辑

Summary

Environment

Expected behavior

Actual behavior

Steps to reproduce the behavior

在path为空时应该同group一样,全部为0

在图上加上阴影,但阴影却加在了border上

Summary

如题,我想在g6当中实践画一个长方形,然后加上border跟阴影,但加上去后发现阴影是加到了border上而非长方形上; 正确的behavior是将阴影加到长方形上才对,具体可参考这个测试例:

https://riddle.alibaba-inc.com/riddles/eb5f81df

错误的结果图:

预期的结果:(用纯canvas去画的情况)

Uploading image.png…

https://codepen.io/d9767192/pen/EdoXEp

与有田讨论觉得可以区分 fillShadow 和 strokeShadow

再麻烦青湳老师帮忙看看

动画的支持

  1. 支持 repeat 动画
  2. 可以暂停、继续
  3. 可以沿着某个 Path 运动

Missed g6

A canvas library which providing 2d draw for G2 & G6.

动画补间优先级问题

kapture 2018-09-06 at 16 13 37

const canvas = new Canvas({
  containerId: 'c1',
  renderer: 'canvas',
  width: 500,
  height: 500,
  pixelRatio: 1
});
const circle = canvas.addShape('circle', {
  attrs: {
    x: 100,
    y: 100,
    r: 10,
    fill: 'red'
  }
});
circle.animate({
  transform: [
    [ 't', 50, 0 ]
  ]
}, 2000);
circle.animate({
  transform: [
    [ 't', 0, 50 ]
  ]
}, 2000);

支持全局渐变

支持 R(0.5, 0.5, 0.1) 0:#ffffff 1:#1890ff,相对画布计算渐变

getPoint bug

    const canvas = new G.Canvas({
      containerId: 'c1',
      renderer: 'canvas',
      width: 500,
      height: 500
    });
    const path = canvas.addShape('path', {
      attrs: {
        path: [
          [ 'M', 0, 0 ],
          [ 'L', 50, 50 ]
        ]
      }
    });
    expect(path.getPoint(0.5)).eql({
      x: 25,
      y: 25
    });
    path.attr('path', [
      [ 'M', 0, 0 ],
      [ 'L', 100, 100 ]
    ]);
    expect(path.getPoint(0.5)).eql({
      x: 50,
      y: 50
    });

attr 后 getPoint 结果没更新。

`parsePath` 解析 path 字符串支持不完整

RT,parsePath 解析 M259.3 17.8L194 150.2 47.9 171.5c-26.2 3.8-36.7 36.1-17.7 54.6l105.7 103-25 145.5c-4.5 26.3 23.2 46 46.4 33.7L288 439.6l130.7 68.7c23.2 12.2 50.9-7.4 46.4-33.7l-25-145.5 105.7-103c19-18.5 8.5-50.8-17.7-54.6L382 150.2 316.7 17.8c-11.7-23.6-45.6-23.9-57.4 0z 这样一个 SVG path 字符串,和 SVG 本身绘制结果不一样;

在这段字符串中,解析会有两个问题:

  1. L 的连写:L194 150.2 47.9 171.5 应该解析为 ["L", 194, 150.2],["L", 47.9, 171.5], 而不是 ["L", 194, 150.2, 47.9, 171.5]

  2. 没有空格间隔的负数:l-25-145.5 105.7-103 应该解析为 ["l", -25, -145.5], ["l", 105.7, -103] 而不是 ["l", "-25-145.5", "105.7-103"]

这段字符串在 svg 中支持 demo

饼图显示问题

Summary

官网给的一个例子中, 饼图中的环图显示,数字为0的在图上有显示颜色, 为1的反倒没有

Environment

antv官方网址第三个,饼图的第三个环图
https://antv.alipay.com/zh-cn/g2/3.x/demo/pie/pie-slice.html
image

Expected behavior

数字为1的红色能出现在饼图中

Actual behavior

数字0的在并图中有显示, 数字为1的反而没有

Steps to reproduce the behavior

将data设置为 var data = [{
type: '分类一',
value: 52
}, {
type: '分类二',
value: 17
}, {
type: '分类三',
value: 30
}, {
type: '分类四',
value: 0
}, {
type: 'Other',
value: 1
}]; 点击运行

Text 如原先文本为 'sdfj\ndfsjdh', 会生成 textArr 属性,当调用 text.attr('text', 'srg') 时,原先的 textArr 属性未清空

Summary

text = new Text({
  attrs: {
    text: 'sdfj\ndfsjdh'
  }
});

console.log(text.attr('textArr'));  //  [ 'sdfj', 'dfsjdh' ] 

// 重新设置 text 属性
text.attr('text', '1234')

// textArr 属性仍然存在,正常情况下应该清空
console.log(text.attr('textArr'));  //  [ 'sdfj', 'dfsjdh' ] 

另外 textArr 这个属性或许放在 text._attrs 下更好,而不是现在的 text._attrs.attrs.

Environment

Expected behavior

Actual behavior

Steps to reproduce the behavior

Shape配置项是否能尽量保持一致

Actual behavior

使用G6的时候发现,矩形的radius仅支持一个数值,不支持数组。

group.addShape('rect',{
    attrs:{
        ...
        radius: 3,  // Array is not allowed
    }
})

Expected behavior

是否能与G绘图接口Shape API保持一致;包括参数值支持的类型以及参数名。

new G.Shape.Rect({
  attrs: {
    x: 50, // 矩形左上角 x 坐标
    y: 50, // 矩形左上角 y 坐标
    height: 20, // 矩形高度
    width: 80, // 矩形宽度
    lineWidth: 1, // html5 canvas 绘图属性
    fill: '#1890FF', // html5 canvas 绘图属性
    strokeStyle: '#000' // html5 canvas 绘图属性
    radius: 0 // 圆角的设置,可以是数值或者数组格式,支持为四个夹角分别设置,用法同 padding
  }
})

对拓展箭头方案的一些思考

对拓展 G 的开发者

注册 Arrow

// 注册一个实心箭头
G.registerArrow('solid', {
  // 以线上点作为自身坐标系原点的一段 path 。
  // 参数可以是 path 字符串、数组;也可以是回调函数(参数是线宽或者线对象本身)
  path: '',     
  stroke: '',    // 描边色
  fill: '',          // 填充色
  offset: 10  // 正数,往终点方向偏移,负数,往起点方向偏移
});

对一般开发者

new G.Line({
  attrs: {
     endArrow: 'solid',       // 实心箭头
     startArrow: 'hollow'   // 空心箭头
  }
});

感觉这样就差不多够用了,斧正一下 @dxq613 @leungwensen @elaine1234

redraw 会造成 svg 动画下会造成不必要的重绘

05acf75#diff-6f0de38008ec4b414692f0933cda543eR117

这个 commit 变更后 svg 在动画下会造成不必要的重绘,例如下图中的 <g /> 标签

aug-14-2018 00-14-17

import g from '@antv/g';

const Canvas = g.Canvas;

var canvas = new Canvas({
  containerId: 'main',
  renderer: 'svg',
  width: 500,
  height: 600
});

var group = canvas.addGroup();
var shape = group.addShape('circle', {
  attrs: {
    x: 100,
    y: 100,
    r: 50,
    fill: 'red'
  }
});

canvas.draw();

shape.animate({
  x: 50,
  y: 50,
}, 5000, 'easeLinear', () => { }, 1000);

shape 当中的 image 需要支持跨域

Summary

在 shape 中的 __setAttrImg 方法中,如果传入 url,需要在 new Image 之后设置跨域属性

Environment

if (Util.isString(img)) {
      const image = new Image();
      image.onload = function() {
        if (self.get('destroyed')) return false;
        self.attr('imgSrc', img);
        self.attr('img', image);
        const callback = self.get('callback');
        if (callback) {
          callback.call(self);
        }
        self.set('loading', false);
      };
      image.src = img;
  
      // 需要在此处添加
      image.crossOrigin = 'Anonymous'
      
      self.set('loading', true);
    }

Expected behavior

支持了跨域图片之后,后续通过画布导出图片时,就不会遇到 canvas 污染的问题,否则在 canvas.toDataURL 时,会检测到有跨域图片从而报错

Actual behavior

Steps to reproduce the behavior

need effective element.clone()

need effective element.clone()

So far, there are many problems to clone element in this way. Such as :

  1. clone lots of unneed attr such as strokeStyle.
  2. shallow copy means matrix is the same object between origin shape and copy shape , it will cause other problems.

canvas版clip

Summary

目前更新clip形状后的效果是叠加而不是替换。正确效果是替换

Environment

Expected behavior

Actual behavior

Steps to reproduce the behavior

svg模式label/text的baseline在firefox下不生效

Summary

问题参考 g6下提出的issue

Environment

Firefox 65.0.2 - windows

Expected behavior

文字按设置的baseline呈现

Actual behavior

baseline在firefox下不生效

RCA

@AntV\g\src\renderers\svg\painter.js l561
el.setAttribute('alignment-baseline', BASELINE_MAP[attrs.textBaseline] || 'baseline');
这里的alignment-baseline Firefox不支持,需要增加dominant-baseline属性,注意MAP的值也不一致,比如alignment-baseline="before-edge" 对应dominant-baseline="text-before-edge"

参考

stackoverflow
alignment-baseline
dominant-baseline

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.