Tem uma solução que já utilizei, não sei se é boa ou não para o seu caso... para meu projeto específico facilitou, mas fico com um pouco de vergonha de mostrar nesse tópico que tem gente que manja pra caramba de graficos... rsrs
Trata-se de ter um sistema de coordenadas "virtuais", que tem o eixo y invertido e medidas lógicas fixas para x e y (por exemplo, um canvas de 1000 por 1000 unidades).
Guardo as coordenadas e dimensões dos objetos do modelo nesse sistema de coordenadas lógicas.
E existe um objeto responsável por converter esse sistema lógico para o sistema de coordenadas de tela. Ele calcula para cada ponto o valor correspondente, pois se mantém atualizado sobre as dimensões físicas do frame.
Facilita um pouco os cálculos de posicionamento, e vc ainda leva de graça a habilidade de mudar o tamanho da tela e as proporções de tamanho entre os objetos permanecerem iguais. A desvantagem é que os métodos de desenho ficam um pouco mais sujos, pois é preciso converter cada ponto:
Mais ou menos assim:
// Traçando uma linha do meio para o canto superior direito da tela:
// Os pontos sao tratados no sistema de medidas lógico, uma area de 1000 por 1000 unidades.
Point meioDaTela = new Point(500,500);
Point superiorDireito = new Point(1000,1000);
// A referencia converter é o conversor entre sistemas de medida, e foi instanciado anteriormente com as
// medidas reais da tela.
Point meioDaTelaPhys = converter.toScreenCoordinates(meioDaTela);
Point superiorDireitoPhys = converter.toScreenCoordinates(superiorDireito);
g.drawLine(meioDaTelaPhys.x, meioDaTelaPhys.y, superiorDireitoPhys.x, superiorDireitoPhys.y);